让 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 效果不包括像 add
或 mov
甚至 movzx
这样的指令。例如,对于内存操作数,它们会明确地将大小指示为 qword ptr [rdi]
,而 objdump 总是包含它,即使它被另一个操作数隐含。
【讨论】:
以上是关于让 objdump 在每个助记符上使用像 l 这样的操作数大小的后缀,即使它不是模棱两可的?的主要内容,如果未能解决你的问题,请参考以下文章