如何做到这一点?
如果我想分析某些东西是如何编译的,我将如何获得发出的汇编代码?
最佳答案
使用 -S gcc
(或 g++
)的选项,可选地带有 -fverbose-asm在默认 -O0 下效果很好将 C 名称作为注释附加到 asm 操作数。它在任何优化级别上的效果都不太好,您通常希望使用它来获得值得一看的 asm。
gcc -S helloworld.c
这将在 helloworld.c 上运行预处理器 (cpp),执行初始编译,然后在运行汇编器之前停止。有关在这种情况下使用的有用编译器选项,请参阅 How to remove "noise" from GCC/clang assembly output? (或者只是查看 Matt Godbolt's online Compiler Explorer 上的代码,它会过滤掉指令和内容,并使用调试信息突出显示以匹配源代码行与 asm。)
默认情况下,这将输出文件helloworld.s
。仍然可以使用 -o 设置输出文件。选项,包括要写入 standard output 的 -o -
用于管道进入 less .
gcc -S -o my_asm_output.s helloworld.c
当然,这只有在您有原始来源时才有效。
如果您只有生成的目标文件,另一种方法是使用 objdump ,通过设置 --disassemble
选项(或缩写形式的 -d
)。
objdump -S --disassemble helloworld > helloworld.dump
-S
将源代码行与正常的反汇编输出交错,因此如果为目标文件(编译时 -g)启用了调试选项并且该文件没有被剥离,则此选项最有效.
运行 file helloworld
将为您提供一些关于使用 objdump 将获得的详细程度的指示。
其他有用的 objdump
选项包括 -rwC
(用于显示符号重定位、禁用长机器代码的换行以及对 C++ 名称进行解码)。如果你不喜欢 x86 的 AT&T 语法,-Mintel
。见 the man page .
例如,objdump -drwC -Mintel -S foo.o |少
。
-r
对于只有 00 00 00 00
占位符用于符号引用的 .o
非常重要,而不是链接的可执行文件。
关于c++ - 如何从 GCC 中的 C/C++ 源代码获取汇编程序输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/137038/