在 LTO 模式下从 GCC/Clang 获取汇编输出

Getting assember output from GCC/Clang in LTO mode

通常,可以使用 GCC 和 Clang 中的 -S 标志从源文件 ,如下例所示。

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

但是假设我使用 -O3 -flto 编译所有源文件以启用 link 次全程序优化,并希望查看编译器为函数生成的最终优化程序集,and/or 参见 where/how 代码被内联。

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

但是如果我想从这个过程中得到汇编输出怎么办?也就是说,在 IR 编译到程序集期间以及在实际程序集和 linkage 进入最终可执行文件。

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

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

对于 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

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

生成 asm