🔍

クロスコンパイル環境での逆アセンブル表示にはllvm-objdumpが便利

2023/01/19に公開

前回の記事
https://zenn.dev/tetsu_koba/articles/b54e954809a86c
のように、複数のアーキテクチャ向けにクロスコンパイルした場面では逆アセンブル表示するのに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

関連

https://zenn.dev/tetsu_koba/articles/b54e954809a86c
https://zenn.dev/tetsu_koba/articles/17959ee2770aa3

Discussion