【发布时间】:2014-08-23 00:52:42
【问题描述】:
我正在尝试使 GHC Haskell 编译器的编译 100% 可重现(字节相同)。
目标文件已经是字节相同的,但最终链接的二进制文件不是。
GHC 将最终链接委托给gcc,例如:
/usr/bin/gcc -fno-stack-protector -DTABLES_NEXT_TO_CODE -o Main Main.o [..some more files..] /tmp/ghc21220_0/ghc21220_5.o /tmp/ghc21220_0/ghc21220_7.o [...] '-Wl,--hash-size=31' -Wl,--reduce-memory-overheads
有趣的是,临时文件ghc21220_7.o的文件名出现在链接的二进制文件中。
看来我可以使用strip 工具将其删除。
为什么会出现文件名,它的用途是什么?
是否有一个标志告诉gcc(或者ld?)不要包含这些文件名?
更新:如果我在二进制文件上运行objdump --syms,我会看到
0000000000000000 l df *ABS* 0000000000000000 ghc21220_5.c
0000000000000000 l df *ABS* 0000000000000000 ghc21220_7.c
根据thisd表示调试,f表示文件。我的问题仍然存在:.c 文件的文件名为什么以及如何使其进入最终二进制文件,我可以在编译时抑制它(而不是稍后运行strip)?
【问题讨论】:
-
1) 期望工具链一遍又一遍地生成 100 字节相同的二进制文件是不现实的,如果不包含其他时间戳的话,通常是不现实的。是的,如果您制作的 .bin 或 .hex 或某种不支持其他内容的格式在理论上肯定是相同的,只要它是 100% 您的代码且没有库。 2)这些东西是为那些使用调试器的人准备的,他们不喜欢阅读汇编程序,如果那是他们得到的东西,就会抱怨 3)只使用条带。或者一种文件格式,除了代码和数据之外没有任何空间,没有元数据。
-
如果可能的话,我想这里唯一与 stackoverflow 相关的真正问题是如何不首先添加调试内容,而不必稍后将其删除。