我想知道gcc链接器选项(例如:-Wl,options)是否会改变编译后的可执行文件中的汇编指令,就像使用某些gcc优化选项一样会发生的那样?当您比较编译后的二进制文件(例如比较签名)时,使用链接器选项和不使用之间的差异是否可以看到?
更新:
更准确地说,我想弄清楚在编译过程中使用某些链接选项是否会更改FLIRT签名。这些签名仅使用库函数来创建签名。
更新:
更准确地说,我想弄清楚在编译过程中使用某些链接选项是否会更改FLIRT签名。这些签名仅使用库函数来创建签名。
对于某些连接器选项,可以在生成的二进制文件中看到变化,例如:
--strip-all
、--strip-debug
、--discard-all
)--as-needed
、--emit-relocs
)ld -o foo a.obj b.obj c.obj
和ld -o foo a.obj c.obj b.obj
如果解析了从a到c中的函数调用,则 可能 会产生不同的二进制文件(来自c.obj的代码偏移量以及c中函数的地址将 可能 不同)但即使在链接后,二进制文件的签名也可能会发生变化。例如在Linux中,当您通过运行prelink来优化二进制文件的启动时间时。
是的,如果使用不同的链接器选项链接两个二进制文件,你将会看到不同的校验和——除非该选项没有产生影响,例如当你指定默认选项或者一个不改变二进制文件的选项(-print-map)时。
你想要弄清楚什么?听起来你在指定某些链接器选项时遇到了问题,想要找出原因。告诉我们更多细节,也许我们能够提供更好的帮助。
--wrap
。 - Phillip