让 objdump 在每个助记符上使用像 l 这样的操作数大小的后缀,即使它不是模棱两可的?

Posted

技术标签:

【中文标题】让 objdump 在每个助记符上使用像 l 这样的操作数大小的后缀,即使它不是模棱两可的?【英文标题】:Make objdump use an operand-size suffix like l on every mnemonic, even when it's not ambiguous? 【发布时间】:2021-08-03 03:52:05 【问题描述】:

今天,我发现了在 Linux 中使用 objdump 来查找 At&t 语法的程序的反汇编代码。使用 objdump 时,反汇编代码看起来不错,但在助记符后缺少“l”结尾(应该是“movl”而不是“mov”)。有什么方法可以配置 objdump 来解决这个问题?

当前生成的反汇编程序:


stuff:     file format elf32-i386


Disassembly of section .text:

08049000 <_start>:
 8049000:   eb 00                   jmp    8049002 <print_stuff>

08049002 <print_stuff>:
 8049002:   b8 04 00 00 00          mov    $0x4,%eax
 8049007:   bb 01 00 00 00          mov    $0x1,%ebx
 804900c:   b9 05 00 00 00          mov    $0x5,%ecx
 8049011:   ba 0b 00 00 00          mov    $0xb,%edx
 8049016:   cd 80                   int    $0x80
 8049018:   eb 00                   jmp    804901a <end_program>

0804901a <end_program>:
 804901a:   b8 01 00 00 00          mov    $0x1,%eax
 804901f:   bb 05 00 00 00          mov    $0x5,%ebx
 8049024:   cd 80                   int    $0x80

我想要的样子:


stuff:     file format elf32-i386


Disassembly of section .text:

08049000 <_start>:
 8049000:   eb 00                   jmp     8049002 <print_stuff>

08049002 <print_stuff>:
 8049002:   b8 04 00 00 00          movl    $0x4,%eax
 8049007:   bb 01 00 00 00          movl    $0x1,%ebx
 804900c:   b9 05 00 00 00          movl    $0x5,%ecx
 8049011:   ba 0b 00 00 00          movl    $0xb,%edx
 8049016:   cd 80                   int     $0x80
 8049018:   eb 00                   jmp     804901a <end_program>

0804901a <end_program>:
 804901a:   b8 01 00 00 00          movl    $0x1,%eax
 804901f:   bb 05 00 00 00          movl    $0x5,%ebx
 8049024:   cd 80                   int     $0x80

【问题讨论】:

mov $0x4,%eax 是有效的 AT&T 语法,当它被寄存器操作数隐含时省略操作数大小后缀。我将您的标题更新为更具体,假设出于某种原因确实是您想要的。 【参考方案1】:

要使用冗余后缀使您的输出混乱,即使它是由寄存器操作数隐含的,请使用

objdump -d -M suffix  foo

来自the objdump(1) man page:

suffix” 在 AT&T 模式下以及在 Intel 模式下对于一组有限的指令,指示 反汇编程序打印助记符后缀,即使后缀可以由操作数推断出来,或者,对于 某些指令,执行模式的默认值。


顺便说一句,“英特尔语法的有限子集”包括诸如相对 jmp rel32 之类的指令,例如

$ objdump -d -M intel /bin/ls
   ...
    436e:       e9 12 fe ff ff          jmp    4185 <__cxa_atexit@plt+0x155>

$ objdump -d -M intel,suffix /bin/ls
   ...
    436e:       e9 12 fe ff ff          jmpq   4185 <__cxa_atexit@plt+0x155>

(相关:What is callq instruction? - objdump -Mintel 打印 callq / retq 即使没有 suffix 选项。)

intel-syntax 效果不包括像 addmov 甚至 movzx 这样的指令。例如,对于内存操作数,它们会明确地将大小指示为 qword ptr [rdi],而 objdump 总是包含它,即使它被另一个操作数隐含。

【讨论】:

以上是关于让 objdump 在每个助记符上使用像 l 这样的操作数大小的后缀,即使它不是模棱两可的?的主要内容,如果未能解决你的问题,请参考以下文章

objdump -d -l

向客户端呈现REST Web服务接口

如果没有文件、objdump 或 gdb,如何知道二进制文件是不是包含调试符号?

我应该设置errno吗?

使用javascript在画布上创建多个按钮

[转]简单科普私钥地址助记词Keystore的区别