🔍
クロスコンパイル環境での逆アセンブル表示にはllvm-objdumpが便利
前回の記事llvm-objdump
を使うのが便利です。
Debian/Ubuntuでは sudo apt install llvm
でインストールできます。
マルチアーキテクチャに対応するllvm-objdump
ELFのヘッダ情報でアーキテクチャ種別を判別してくれるので、明示的にアーキテクチャを指定する必要がありません。gcc系のobjdumpだとアーキテクチャごとに別々のものを使う必要がありました。
$ llvm-objdump -d x86_64/a.out |head -20
x86_64/a.out: file format elf64-x86-64
Disassembly of section .text:
0000000000201eb0 <_start>:
201eb0: 48 31 ed xorq %rbp, %rbp
201eb3: 48 89 e7 movq %rsp, %rdi
201eb6: 48 8d 35 43 e1 df ff leaq -2105021(%rip), %rsi # 0x0 <wctomb.c>
201ebd: 48 83 e4 f0 andq $-16, %rsp
201ec1: e8 00 00 00 00 callq 0x201ec6 <_start_c>
0000000000201ec6 <_start_c>:
201ec6: 8b 37 movl (%rdi), %esi
201ec8: 48 8d 57 08 leaq 8(%rdi), %rdx
201ecc: 48 8d 3d 1d 00 00 00 leaq 29(%rip), %rdi # 0x201ef0 <main>
201ed3: 48 8d 0d 83 31 00 00 leaq 12675(%rip), %rcx # 0x20505d <_init>
201eda: 4c 8d 05 7f 31 00 00 leaq 12671(%rip), %r8 # 0x205060 <_fini>
201ee1: 45 31 c9 xorl %r9d, %r9d
201ee4: e9 e8 01 00 00 jmp 0x2020d1 <__libc_start_main>
$ llvm-objdump -d aarch64/a.out |head -20
aarch64/a.out: file format elf64-littleaarch64
Disassembly of section .text:
00000000002111e4 <_start>:
2111e4: 1d 00 80 d2 mov x29, #0
2111e8: 1e 00 80 d2 mov x30, #0
2111ec: e0 03 00 91 mov x0, sp
2111f0: 61 ef ff f0 adrp x1, 0x0 <$d.6+0xf814>
2111f4: 21 00 00 91 add x1, x1, #0
2111f8: 1f ec 7c 92 and sp, x0, #0xfffffffffffffff0
2111fc: 01 00 00 14 b 0x211200 <_start_c>
0000000000211200 <_start_c>:
211200: e2 03 00 aa mov x2, x0
211204: a0 00 00 90 adrp x0, 0x225000 <main+0x2c>
211208: a3 00 00 90 adrp x3, 0x225000 <main+0x30>
21120c: a4 00 00 90 adrp x4, 0x225000 <dummy1>
211210: e5 03 1f aa mov x5, xzr
$ llvm-objdump -d riscv64/a.out |head -20
riscv64/a.out: file format elf64-littleriscv
Disassembly of section .text:
0000000000011d7c <_start>:
11d7c: 97 61 00 00 auipc gp, 6
11d80: 93 81 c1 0e addi gp, gp, 236
11d84: 0a 85 mv a0, sp
0000000000011d86 <.Lpcrel_hi1>:
11d86: 97 e5 fe ff auipc a1, 1048558
11d8a: 93 85 a5 27 addi a1, a1, 634
11d8e: 13 71 01 ff andi sp, sp, -16
11d92: 17 03 00 00 auipc t1, 0
11d96: 67 00 83 00 jr 8(t1)
0000000000011d9a <_start_c>:
11d9a: 0c 41 lw a1, 0(a0)
使ったllvm-objdump
のバージョンは以下の通り。
$ llvm-objdump --version
Ubuntu LLVM version 14.0.0
Optimized build.
Default target: aarch64-unknown-linux-gnu
Host CPU: neoverse-n1
Registered Targets:
aarch64 - AArch64 (little endian)
aarch64_32 - AArch64 (little endian ILP32)
aarch64_be - AArch64 (big endian)
amdgcn - AMD GCN GPUs
arm - ARM
arm64 - ARM64 (little endian)
arm64_32 - ARM64 (little endian ILP32)
armeb - ARM (big endian)
avr - Atmel AVR Microcontroller
bpf - BPF (host endian)
bpfeb - BPF (big endian)
bpfel - BPF (little endian)
hexagon - Hexagon
lanai - Lanai
m68k - Motorola 68000 family
mips - MIPS (32-bit big endian)
mips64 - MIPS (64-bit big endian)
mips64el - MIPS (64-bit little endian)
mipsel - MIPS (32-bit little endian)
msp430 - MSP430 [experimental]
nvptx - NVIDIA PTX 32-bit
nvptx64 - NVIDIA PTX 64-bit
ppc32 - PowerPC 32
ppc32le - PowerPC 32 LE
ppc64 - PowerPC 64
ppc64le - PowerPC 64 LE
r600 - AMD GPUs HD2XXX-HD6XXX
riscv32 - 32-bit RISC-V
riscv64 - 64-bit RISC-V
sparc - Sparc
sparcel - Sparc LE
sparcv9 - Sparc V9
systemz - SystemZ
thumb - Thumb
thumbeb - Thumb (big endian)
ve - VE
wasm32 - WebAssembly 32-bit
wasm64 - WebAssembly 64-bit
x86 - 32-bit X86: Pentium-Pro and above
x86-64 - 64-bit X86: EM64T and AMD64
xcore - XCore
関連
Discussion