Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gcc为不同的文件名生成不同的结果_C_Gcc - Fatal编程技术网

gcc为不同的文件名生成不同的结果

gcc为不同的文件名生成不同的结果,c,gcc,C,Gcc,为什么gcc会为不同的SourceFileName生成不同的可执行文件 为了进行测试,我有一个名为test.c和test2.c的c程序: int main(){} “gcc test.c-o test”和“gcc test2.c-o test2”生成不同的输出文件。使用十六进制编辑器,我可以看到仍然有它的源文件名隐藏在它。剥离文件仍然会导致不同的结果(源文件名已消失)。gcc为什么这样运作?我也测试了叮当声和tcc。Clang的行为与gcc类似,而tcc为不同的文件名生成相同的结果 gcc版本

为什么gcc会为不同的SourceFileName生成不同的可执行文件

为了进行测试,我有一个名为test.c和test2.c的c程序:

int main(){}
“gcc test.c-o test”和“gcc test2.c-o test2”生成不同的输出文件。使用十六进制编辑器,我可以看到仍然有它的源文件名隐藏在它。剥离文件仍然会导致不同的结果(源文件名已消失)。gcc为什么这样运作?我也测试了叮当声和tcc。Clang的行为与gcc类似,而tcc为不同的文件名生成相同的结果

gcc版本4.9.1(Debian 4.9.1-1)

叮当声3.4.2-4


tcc版本0.9.25

在两个二进制文件的hextdump上执行一个
diff
,在偏移量
0x0280
附近显示一个小差异。通过查看这些部分(通过
objdump-x
),差异出现在
.note.gnu.buildid
部分。我的猜测是,这提供了某种UUID,用于区分其他类似代码的不同版本,以及验证调试信息(参考,大约三分之一)。如果你给他不同的-o目标,它将生成不同的文件

gcc test.c-o foo

您有一个
foo
可执行文件


另外,请注意,如果没有-o选项,gcc将输出一个
a.out
可执行文件。

我刚刚检查过,在
strip-s test1 test2
之后,文件是相同的(gcc 4.8.2)。文件名放在符号表中,但我不知道是为了什么目的?与gcc 4.9.0和clang3.4.2的结果相同。你能发布你的
strip
命令吗?我做了“strip-s测试和&strip-s测试2”。在64位Linux上运行,你是对的。启用时,生成id唯一标识链接器的每个输出。据我所知,它们的主要用途是,当二进制文件位于一个单独的文件中时,将二进制文件绑定到调试符号。OP询问的是文件内容的差异,而不是文件名的差异。