gcc链接器选项可以更改已编译二进制文件中的汇编器指令吗?

时间:2016-05-17 12:30:55

标签: gcc assembly optimization compilation linker

我想知道gcc链接器选项(例如:-Wl, options )是否可以更改已编译可执行文件中的汇编程序指令,因为如果使用某些gcc优化选项会发生这种情况? 在比较编译的二进制文件时(例如比较签名),可以看到使用链接器选项与不使用它之间的区别吗?

更新

更准确地说,我想知道在编译过程中使用某些链接选项时FLIRT签名是否会发生变化。这些签名仅使用库函数来创建签名。

2 个答案:

答案 0 :(得分:4)

对于某些链接器选项,可以在生成的二进制文件中看到更改,例如:

  • 摆脱/保留调试符号的选项(--strip-all--strip-debug--discard-all
  • 摆脱/保留未使用部分的选项,例如包含从未在其他部分中引用的函数的节。可以轻松删除这些部分。或者保留重定位部分/内容。 (--as-needed--emit-relocs
  • 包含一个静态库或另一个兼容的静态库的选项(例如库版本x.0与版本x.1)
  • 对象和静态库放置在命令行上的顺序。例如ld -o foo a.obj b.obj c.objld -o foo a.obj c.obj b.obj 可能会生成不同的二进制文件,如果从c到c中的函数的调用被解析(来自c.obj的代码的偏移量,因此c中函数的地址可能不同)

但即使在链接之后,二进制文件的签名也可能发生变化。例如,在Linux中,通过运行prelink

来优化二进制启动时间

答案 1 :(得分:1)

是的,您将在与不同链接器选项链接的两个二进制文件上看到不同的校验和 - 除非该选项无效,例如当您指定默认选项或不更改二进制文件的选项时(-print-)图)。

你想弄清楚到底是什么?当您指定某些链接器选项并且您试图弄清楚原因时,听起来您遇到了问题。告诉我们更多信息,也许我们可以提供更好的帮助。