url: https://linuxcommand.net/objdump/
title: "objdump - オブジェクトファイルの情報を表示する"
description: "objdumpコマンドはオブジェクトファイルの内容を表示できるコマンドになります。objdumpコマンドは実行ファイルやオブジェクトファイルを調査するのに便利なコマンドです。objdumpコマンドでアーカイブファイルを指定するとそのアーカイ..."
host: linuxcommand.net
favicon: https://linuxcommand.net/wp-content/uploads/2021/02/cropped-favicon-32x32.png
image: https://linuxcommand.net/wp-content/uploads/2018/07/objdump.jpg
url: https://manpages.ubuntu.com/manpages/jammy/ja/man1/objdump.1.html
title: "Ubuntu Manpage: objdump - オブジェクトファイルの情報を表示する"
host: manpages.ubuntu.com
favicon: https://assets.ubuntu.com/v1/cb22ba5d-favicon-16x16.png
objdump とは?
objdump は M4 Mac の環境において LLVM のオブジェクトファイルをダンプするコマンドです。 オブジェクトファイルの中身を表示します。
man objdump
LLVM-OBJDUMP(1) LLVM LLVM-OBJDUMP(1)
NAME
llvm-objdump - LLVM's object file dumper
SYNOPSIS
llvm-objdump [commands] [options] [filenames...]
DESCRIPTION
The llvm-objdump utility prints the contents of object files and final linked images named on the command line. If no file name is specified, llvm-objdump will attempt to read from a.out. If - is used as a file name, llvm-objdump
will process a file on its standard input stream.
逆アセンブルしてみる
C 言語プログラムを実行するまでになにがおこなわれるか の main.c を reverse-assemblel してみます。 この逆アセンブルは reverse-engineering の一種でオブジェクトファイルもしくは実行ファイルからアセンブリコードを生成します。 直接バイナリを見るよりもわかりやすいというメリットがあります。 ただし、もともとの C ソースコードと比べてコメントなどは抜け落ちています。これはコンパイルでアセンブリコードとして生成する時点で削られているためです。
-D/-d
- disassemble
-D
だとすべて逆アセンブルする
-l
- ソースコードの行番号を出す
- おそらく .o ファイルを生成するときにデバッグオプションをつけてデバッグ情報を付与している必要がある
逆アセンブルしてみると、下記のようになります。
Disassembly of section __TEXT,__text:
で .text = プログラム命令
が逆アセンブルで得られています。
d100c3ff は arm64 アーキテクチャの命令であり、 opcode (sub) と operand (sp, sp, 0x30
) を表しています。
また、続く a9027bfd も opcode (stp) と operand (x29, x30, …) を表す命令です。
❮ objdump -D -l main.o
main.o: file format mach-o arm64
Disassembly of section __TEXT,__text:
0000000000000000 <ltmp0>:
; main():
0: d100c3ff sub sp, sp, #0x30
4: a9027bfd stp x29, x30, [sp, #0x20]
8: 910083fd add x29, sp, #0x20
c: 52800008 mov w8, #0x0 ; =0
10: b9000be8 str w8, [sp, #0x8]
14: b81fc3bf stur wzr, [x29, #-0x4]
18: b81f83a0 stur w0, [x29, #-0x8]
1c: f9000be1 str x1, [sp, #0x10]
20: 528000a0 mov w0, #0x5 ; =5
24: 52800101 mov w1, #0x8 ; =8
28: 94000000 bl 0x28 <ltmp0+0x28>
2c: b9000fe0 str w0, [sp, #0xc]
30: b9400fe8 ldr w8, [sp, #0xc]
34: 910003e9 mov x9, sp
38: f9000128 str x8, [x9]
3c: 90000000 adrp x0, 0x0 <ltmp0>
40: 91000000 add x0, x0, #0x0
44: 94000000 bl 0x44 <ltmp0+0x44>
48: b9400be0 ldr w0, [sp, #0x8]
4c: a9427bfd ldp x29, x30, [sp, #0x20]
50: 9100c3ff add sp, sp, #0x30
54: d65f03c0 ret
Disassembly of section __DATA,__data:
0000000000000058 <ltmp1>:
; globalW():
58: 00000064 udf #0x64
Disassembly of section __TEXT,__cstring:
000000000000005c <ltmp2>:
; ltmp2():
5c: 206d7553 <unknown>
60: 6425203d fmul z29.h, z1.h, z5.h[0]
64: 0a 00 <unknown>
Disassembly of section __LD,__compact_unwind:
0000000000000068 <ltmp3>:
...
; ltmp3():
70: 00000058 udf #0x58
74: 04000000 add z0.b, p0/m, z0.b, z0.b
...
.data
では globalW がメモリアドレス 0x58 に定義されており、値は 0x64 = 100 が設定されています。
.text.cstring
では 0x5c に 206d7553 = muS, 6425203d=d% のように定数文字列リテラルが入っています。