在 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
通常,可以使用 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
.