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

Max*_*ian 5 optimization assembly linker gcc compilation

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

UPDATE

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

Eli*_*an9 5

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

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

但即使在链接之后,二进制文件的签名也可能会发生变化。例如,在 Linux 中,当您通过运行prelink来优化二进制启动时间时

  • 是的,对其他对象的调用可能会解析为不同的偏移量/地址,具体取决于它们的顺序或静态库的顺序或库的不同版本。 (3认同)
  • @PeterFox不,它们通常会根据它们最终在可执行文件中的位置以及它们引用的其他内容最终驻留的位置而有所不同。 (2认同)