为什么gcc为不同的源文件名生成不同的可执行文件?
测试我有这个名为test.c和test2.c的c-programm:
int main(){}
“gcc test.c -o test”和“gcc test2.c -o test2”生成不同的输出文件。使用十六进制编辑器,我可以看到它的源文件名仍然隐藏在其中。剥离文件仍然会导致不同的结果(源文件名已消失)。为什么gcc以这种方式运作?我也测试了clang和tcc。 Clang的行为与gcc类似,而tcc为不同的文件名生成相同的结果?
gcc版本4.9.1(Debian 4.9.1-1)
clang 3.4.2-4
tcc版本0.9.25
答案 0 :(得分:4)
对两个二进制文件的hexdump执行diff
会在偏移0x0280
附近显示一个小差异。查看各个部分(通过objdump -x
),差异会显示在.note.gnu.build-id
部分中。我的猜测是,这提供了某种UUID,用于区分其他类似代码的不同构建,以及验证调试信息(引用here,大约三分之一)。
答案 1 :(得分:-1)
gcc的-o选项是指定输出文件。如果你给他不同的-o目标,它将生成不同的文件。
gcc test.c -o foo
你有一个foo
可执行文件。
另外,请注意,如果没有-o选项,gcc将输出a.out
可执行文件。