为什么链接的二进制文件包含已使用的目标文件的文件名,如何将其删除?

2小时

我正在尝试使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

根据这个 d办法调试和f手段的文件。我的问题仍然存在:为什么文件名以及文件名如何精确地.c将其制成最终的二进制文件,我可以在编译时取消此操作(而不是strip稍后运行)吗?

罗斯·里奇

源文件名在可执行文件中显示为符号,因为在发出汇编程序时,GCC要做的第一件事是向.file输出写入指令。然后,汇编器将其转换为目标文件中的符号,链接器将其与所有其他符号一起放入可执行文件中。我不确定它是否有用,但是它可能允许链接器错误地给出源文件名而不是目标文件名。

除了修改代码外,您无济于事,无法阻止GCC生成.file指令或阻止汇编程序将其转换为目标文件中的符号。您可以使用-x告诉其删除所有本地符号选项,告诉链接器不要将它们包括在可执行文件中。

另一个更有针对性的选择是使用strip命令从目标文件中仅剥离文件名符号:

strip -N ghc21220_5.c ghc21220_5.o

最终,当您认为C源文件相同时,可以选择给它们指定相同的名称。最终,您对文件名的选择是您在可执行文件中看到的差异的来源。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将* .o目标文件链接到内核二进制文件中

来自分类Dev

如何使用gcc / ld将目标文件链接到原始二进制文件?

来自分类Dev

为什么我必须使用ld链接我的二进制文件

来自分类Dev

如何从目标文件生成普通二进制文件?

来自分类Dev

静态链接的二进制文件如何小于动态链接的二进制文件?

来自分类Dev

为什么可执行二进制文件包含包含的头文件的路径?

来自分类Dev

为什么“二进制文件”不在原始二进制文件中?

来自分类Dev

函数采用二进制文件/流/文件名并将其转换为可读文本格式的适当参数/返回类型是什么?

来自分类Dev

为什么较少将其配置存储在二进制文件中?

来自分类Dev

二进制文件如何“二进制”?

来自分类Dev

Python:从二进制文件而不是文件名打开zip文件

来自分类Dev

g ++为什么不必链接iostream二进制文件,但对于pthread呢?

来自分类Dev

为什么“链接时间优化”会导致二进制文件更大?

来自分类Dev

使用whereis找到符号链接的二进制文件

来自分类Dev

为什么git索引文件是二进制的?

来自分类Dev

cat为什么更改二进制文件的内容?

来自分类Dev

为什么忽略二进制文件是最佳做法?

来自分类Dev

从二进制文件删除

来自分类Dev

如何将命令参数链接到特定的命令二进制文件

来自分类Dev

汇编文件,目标文件和二进制文件之间有什么区别?

来自分类Dev

如何将二进制文件读入数组

来自分类Dev

XCode:在构建阶段中意外删除“使用库链接二进制文件”选项

来自分类Dev

如何从DLL二进制文件中删除功能

来自分类Dev

如何从二进制文件中删除HomeKit API

来自分类Dev

链接两个目标文件以生成一个二进制文件

来自分类Dev

如何将qrc数据包含到使用CMake编译的基于Qt的二进制文件中

来自分类Dev

符号链接会发生什么?原始二进制文件和符号二进制文件的行为不同

来自分类Dev

确定文件名和已下载(二进制数据)文件的范围

来自分类Dev

如何将包含另一个对象向量的对象保存到文件中,并使用C ++中的二进制文件从文件中读取?

Related 相关文章

  1. 1

    如何将* .o目标文件链接到内核二进制文件中

  2. 2

    如何使用gcc / ld将目标文件链接到原始二进制文件?

  3. 3

    为什么我必须使用ld链接我的二进制文件

  4. 4

    如何从目标文件生成普通二进制文件?

  5. 5

    静态链接的二进制文件如何小于动态链接的二进制文件?

  6. 6

    为什么可执行二进制文件包含包含的头文件的路径?

  7. 7

    为什么“二进制文件”不在原始二进制文件中?

  8. 8

    函数采用二进制文件/流/文件名并将其转换为可读文本格式的适当参数/返回类型是什么?

  9. 9

    为什么较少将其配置存储在二进制文件中?

  10. 10

    二进制文件如何“二进制”?

  11. 11

    Python:从二进制文件而不是文件名打开zip文件

  12. 12

    g ++为什么不必链接iostream二进制文件,但对于pthread呢?

  13. 13

    为什么“链接时间优化”会导致二进制文件更大?

  14. 14

    使用whereis找到符号链接的二进制文件

  15. 15

    为什么git索引文件是二进制的?

  16. 16

    cat为什么更改二进制文件的内容?

  17. 17

    为什么忽略二进制文件是最佳做法?

  18. 18

    从二进制文件删除

  19. 19

    如何将命令参数链接到特定的命令二进制文件

  20. 20

    汇编文件,目标文件和二进制文件之间有什么区别?

  21. 21

    如何将二进制文件读入数组

  22. 22

    XCode:在构建阶段中意外删除“使用库链接二进制文件”选项

  23. 23

    如何从DLL二进制文件中删除功能

  24. 24

    如何从二进制文件中删除HomeKit API

  25. 25

    链接两个目标文件以生成一个二进制文件

  26. 26

    如何将qrc数据包含到使用CMake编译的基于Qt的二进制文件中

  27. 27

    符号链接会发生什么?原始二进制文件和符号二进制文件的行为不同

  28. 28

    确定文件名和已下载(二进制数据)文件的范围

  29. 29

    如何将包含另一个对象向量的对象保存到文件中,并使用C ++中的二进制文件从文件中读取?

热门标签

归档