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% のように定数文字列リテラルが入っています。