gpt4 book ai didi

gcc - 如何在gcc中获得完整的汇编程序输出?

转载 作者:行者123 更新时间:2023-12-03 08:14:06 25 4
gpt4 key购买 nike

我知道我可以通过使用以下命令获取由编译器生成的汇编器源代码:

gcc -S ...

即使这很烦人,但作为过程的一部分并没有给我一个目标文件。

但是,如何获得有关已编译代码的所有信息?我的意思是地址,生成的字节等等。
gcc -S输出的指令不会告诉我有关指令长度或编码的任何信息,这是我想看到的。

最佳答案

我喜欢objdump,但是最有用的选项不是很明显-尤其是在包含重定位而不是最终二进制文件的目标文件上使用它时。
objdump -d some_binary做的很合理。
objdump -d some_object.o的用处不大,因为对外部函数的调用不会被有效地反汇编:

...
00000005 <foo>:
5: 55 push %ebp
6: 89 e5 mov %esp,%ebp
8: 53 push %ebx
...
29: c7 04 24 00 00 00 00 movl $0x0,(%esp)
30: e8 fc ff ff ff call 31 <foo+0x2c>
35: 89 d8 mov %ebx,%eax
...
call实际上是 printf()……添加 -r标志可以帮助实现这一点;它标志着重定位。 objdump -dr some_object.o提供:
...
29: c7 04 24 00 00 00 00 movl $0x0,(%esp)
2c: R_386_32 .rodata.str1.1
30: e8 fc ff ff ff call 31 <foo+0x2c>
31: R_386_PC32 printf
...

然后,我发现查看每条注释为 <symbol+offset>的行很有用。 objdump为此提供了一个方便的选项,但是它具有关闭实际字节转储的烦人的副作用- objdump --prefix-addresses -dr some_object.o提供了:
...
00000005 <foo> push %ebp
00000006 <foo+0x1> mov %esp,%ebp
00000008 <foo+0x3> push %ebx
...

但事实证明,您可以通过提供另一个晦涩难懂的选项来撤销此操作,最后得出我最喜欢的 objdump咒语:
objdump --prefix-addresses --show-raw-insn -dr file.o
给出这样的输出:
...
00000005 <foo> 55 push %ebp
00000006 <foo+0x1> 89 e5 mov %esp,%ebp
00000008 <foo+0x3> 53 push %ebx
...
00000029 <foo+0x24> c7 04 24 00 00 00 00 movl $0x0,(%esp)
2c: R_386_32 .rodata.str1.1
00000030 <foo+0x2b> e8 fc ff ff ff call 00000031 <foo+0x2c>
31: R_386_PC32 printf
00000035 <foo+0x30> 89 d8 mov %ebx,%eax
...

并且如果您使用调试符号构建(即使用 -g编译),并且将 -dr替换为 -Srl,它将尝试用相应的源代码行注释输出。

关于gcc - 如何在gcc中获得完整的汇编程序输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com