12

通常,可以使用 GCC 和 Clang中的标志从源文件中获取 GCC 的优化汇编程序输出-S,如下例所示。

gcc -O3 -S -c -o foo.s foo.c

但是假设我编译所有源文件-O3 -flto以启用链接时全程序优化,并希望查看最终编译器为函数生成的优化程序集,和/或查看代码在何处/如何内联。

正如预期的那样,编译的结果是一堆.o文件,它们实际上是伪装成目标文件的 IR 文件。在链接可执行文件或共享库时,它们会被混合在一起,作为一个整体进行优化,然后编译到目标二进制文件中。

但是如果我想要这个过程的汇编输出呢?也就是说,链接时优化之后、在将 IR 编译为汇编期间以及在实际汇编和链接到最终可执行文件之前产生的汇编源。

我尝试简单地-S在链接步骤中添加一个标志,但这并没有真正起作用。

我知道反汇编可执行文件是可能的,甚至与源代码交错,但有时查看实际编译器生成的程序集会更好,尤其是使用-fverbose-asm.

4

1 回答 1

4

对于 GCC,只需添加-save-temps到链接器命令:

$ gcc -flto -save-temps ... *.o -o bin/libsortcheck.so
$ ls -1
...
libsortcheck.so.ltrans0.s

对于 Clang 来说,情况要复杂得多。如果您使用 GNU ld(默认或-fuse-ld=ld)或 Gold 链接器(通过 启用-fuse-ld=gold),您需要运行-Wl,-plugin-opt=emit-asm

$ clang tmp.c -flto -Wl,-plugin-opt=emit-asm -o tmp.s

对于更新(11+)版本的 LLD 链接器(通过 启用-fuse-ld=lld),您可以使用-Wl,--lto-emit-asm.

于 2021-12-28T08:46:22.560 回答