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

标签 gcc assembly optimization compilation linker

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

更新

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

最佳答案

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

  • 去除/保留调试符号的选项( --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如果解析从 a 到 c 中的函数的调用,则可能会产生不同的二进制文件(c.obj 中代码的偏移量以及 c 中函数的地址可能会有所不同)

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

    关于gcc - gcc 链接器选项可以更改已编译二进制文件中的汇编器指令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37278508/

    相关文章:

    c++ - GCC 默认导出所有符号与 MSVC 默认不导出任何内容之间的设计原理是什么?

    c# - 解析相似汇编指令的正则表达式

    c - 为什么 AVX-256 VMOVAPS 指令只复制四个单精度 float 而不是 8 个?

    C#:编译器优化、函数调用和 bool 表达式短路

    javascript - JS tween如何提高?

    sql - 优化PG查询

    c - stdint.h 和 inttypes.h 丢失

    c++ - 尝试编译 C++ 程序后出错

    没有循环的 C 程序意外地表现得像一个循环

    c++ - Clang 对于 7 次比较生成的代码比 8 次比较生成的代码更差