c++ - 如何从 GCC 中的 C/C++ 源代码获取汇编程序输出?

标签 c++ c assembly gcc disassembly

如何做到这一点?

如果我想分析某些东西是如何编译的,我将如何获得发出的汇编代码?

最佳答案

使用 -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/

相关文章:

c++ - 如何将对象放入 `std::tuple` 并通过仅 move 操作获取第一个项目?

c++ - 使用gdb调试的问题

c - 定义一个函数,函数名被宏屏蔽

assembly - 什么是段落(当提到内存时)

c - 想要使用 ASM 进行快速 8 字节对齐数组复制而不是 memmove

gcc - .cfi_remember_state 的实现

c++ - 成员函数的可访问性似乎随 SFML、C++ 和 Xcode 中的范围而变化

c++ - 使用带有智能指针的 setter/getter

c - 如何使用 -Werror 忽略 gcc 的 "useless storage class"?

c - 包含 lint 和 cstyle 的适合 C 语言的文本编辑器?