objdump 理解ELF 格式文件(如/proc/kcore)。它能够提取文件的可执行部分,而忽略不可执行的内容(例如.note 部分)。
您可以使用-h 标志查看ELF 可执行文件的结构,例如:
# objdump -h /proc/kcore
/proc/kcore: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 note0 00001944 0000000000000000 0000000000000000 000002a8 2**0
CONTENTS, READONLY
1 .reg/0 000000d8 0000000000000000 0000000000000000 0000032c 2**2
CONTENTS
2 .reg 000000d8 0000000000000000 0000000000000000 0000032c 2**2
CONTENTS
3 load1 00800000 ffffffffff600000 0000000000000000 7fffff602000 2**12
CONTENTS, ALLOC, LOAD, CODE
(...)
看起来udis86 中的udcli 工具可能从文件开头开始反汇编东西,这表明您的输出可能会从一堆不相关的输出开始,由您决定执行位置开始。
更新
这是验证。我们使用this answer 从/proc/kcore 中提取第一个load 部分,如下所示:
# dd if=/proc/kcore of=mysection bs=1 skip=$[0x7fffff602000] count=$[0x00800000]
现在如果我们使用udcli 来查看:
# udcli mysection
0000000000000000 48 dec eax
0000000000000001 c7c060000000 mov eax, 0x60
0000000000000007 0f05 syscall
0000000000000009 c3 ret
000000000000000a cc int3
000000000000000b cc int3
我们看到它看起来与objdump -d /proc/kcore 的输出几乎相同:
# objdump -d /proc/kcore
/proc/kcore: file format elf64-x86-64
Disassembly of section load1:
ffffffffff600000 <load1>:
ffffffffff600000: 48 c7 c0 60 00 00 00 mov $0x60,%rax
ffffffffff600007: 0f 05 syscall
ffffffffff600009: c3 retq
ffffffffff60000a: cc int3
ffffffffff60000b: cc int3