Twitterでヘッダーファイルのないテキスト領域の逆アセ方法が分からないとつぶやいたところ、バイナリアンな人達からアドバイスをもらいました。ありがとうございます。
http://twitter.com/yusk_/status/1240773710
http://shinh.skr.jp/m/?date=20090223
objdump -D -m i386 -b binary hello
OpenSPARCのROM(rom_harness.hex)を適当にバイナリファイル(rom_harness.bin)にして、試してみました。
YUKI.N>objdump -b binary -m sparc64-elf -D rom_harness.bin rom_harness.bin: file format binary objdump: Can't use supplied machine sparc64-elf YUKI.N> YUKI.N>objdump -b binary -m elf64-sparc -D rom_harness.bin rom_harness.bin: file format binary objdump: Can't use supplied machine elf64-sparc
sparc64-elfはgcc作成時に--target=で使った値、elf64-sparcはそのgccが作ったelfヘッダーに入っているフォーマットで、どちらを指定しても駄目でした。objdumpをsparc64-elf-objdumpに変更しても同じでした。
(追記)
sparc64-elf-objdump -b binary -m sparc -EB -D rom_harness.bin
で逆アセできました。
sparc64-elf-objdump -i でサポートしているターゲットの一覧を確認し、デフォルトでエンディアンが逆だったので-EBでエンディアンを指定しました。
しょうがないので、64bit SPARCのクロス環境からヘッダーだけ使う作戦を使いました。
もう以下の情報は必要無いのですが、せっかくなので残しておきます。
64bit SPARCクロス環境の構築
binutils-2.18.tar.gzとgcc-4.3.1.tar.gzをダウンロードしてきて、順に例のコマンドを打てばOKです。
YUKI.N>mkdir objdir YUKI.N>cd objdir/ YUKI.N>../configure --target=sparc64-elf --prefix=/usr/local/sparc64-elf YUKI.N>make YUKI.N>make install
gccはエラーが出ますが、実行ファイルは作れました。
elfヘッダーの無いファイルを逆アセする方法
http://sources.redhat.com/ml/ecos-discuss/2001-08/msg00707.html
を参考に、arm-elf-xxxをsparc64-elf-xxxに置き換えます。
YUKI.N>echo > foo.c YUKI.N>sparc64-elf-gcc -c -o foo.o foo.c YUKI.N>sparc64-elf-objcopy --remove-section=.text foo.o YUKI.N>sparc64-elf-objcopy --add-section=.text=rom_harness.bin foo.o YUKI.N>sparc64-elf-objcopy --set-section-flags=.text=alloc,load,code,contents,readonly foo.o YUKI.N>sparc64-elf-objdump -d foo.o
これで、foo.oの.textがrom_harness.binに置き換わったのでobjdumpが使えます。
rom_harnessの逆アセ結果
foo.o: file format elf64-sparc Disassembly of section .text: 0000000000000000 <.text>: 0: 82 10 20 10 mov 0x10, %g1 4: e2 f0 48 40 stxa %l1, [ %g1 ] (66) 8: a2 10 20 03 mov 3, %l1 c: e2 f0 08 a0 stxa %l1, [ %g0 ] (69) 10: a3 48 00 00 rdhpr %hpstate, %l1 14: 81 9c 68 20 wrhpr %l1, 0x820, %hpstate 18: 82 10 20 18 mov 0x18, %g1 1c: c0 f0 0a 01 stxa %g0, [ %g0 + %g1 ] (80) 20: c0 f0 0b 01 stxa %g0, [ %g0 + %g1 ] (88) 24: 03 00 00 00 sethi %hi(0), %g1 28: 82 10 60 00 mov %g1, %g1 ! 0x0 2c: 83 28 70 20 sllx %g1, 0x20, %g1 30: 23 00 00 00 sethi %hi(0), %l1 34: a2 14 40 01 or %l1, %g1, %l1 38: a2 14 60 03 or %l1, 3, %l1 3c: e2 f0 09 60 stxa %l1, [ %g0 ] (75) 40: 03 00 00 00 sethi %hi(0), %g1 44: 82 10 60 00 mov %g1, %g1 ! 0x0 48: 83 28 70 20 sllx %g1, 0x20, %g1 4c: 23 00 02 00 sethi %hi(0x80000), %l1 50: a2 14 40 01 or %l1, %g1, %l1 54: a2 14 60 00 mov %l1, %l1 58: 8b 9d c0 00 wrhpr %l7, %htba 5c: 82 10 20 30 mov 0x30, %g1 60: 84 10 00 00 mov %g0, %g2 64: c0 f0 4a 00 stxa %g0, [ %g1 ] (80) 68: c0 f0 8a a0 stxa %g0, [ %g2 ] (85) 6c: 84 00 a0 08 add %g2, 8, %g2 70: 80 a0 a2 00 cmp %g2, 0x200 74: 12 bf ff fc bne 0x64 78: 01 00 00 00 nop 7c: 82 10 20 30 mov 0x30, %g1 ! 0x30 80: 84 10 00 00 mov %g0, %g2 84: c0 f0 4b 00 stxa %g0, [ %g1 ] (88) 88: c0 f0 8b a0 stxa %g0, [ %g2 ] (93) 8c: 84 00 a0 08 add %g2, 8, %g2 90: 80 a0 a2 00 cmp %g2, 0x200 94: 12 bf ff fc bne 0x84 98: 01 00 00 00 nop 9c: c0 f0 0c 00 stxa %g0, [ %g0 ] (96) a0: 82 10 20 08 mov 8, %g1 a4: c0 f0 0c 01 stxa %g0, [ %g0 + %g1 ] (96) a8: a2 10 20 08 mov 8, %l1 ac: c0 f4 44 20 stxa %g0, [ %l1 ] (33) b0: a2 10 20 10 mov 0x10, %l1 b4: c0 f4 44 20 stxa %g0, [ %l1 ] (33) b8: a2 10 20 0f mov 0xf, %l1 bc: e2 f0 08 a0 stxa %l1, [ %g0 ] (69) c0: 03 00 00 00 sethi %hi(0), %g1 c4: 05 00 01 00 sethi %hi(0x40000), %g2 c8: 82 10 00 01 mov %g1, %g1 cc: 84 10 00 02 mov %g2, %g2 d0: 83 28 70 20 sllx %g1, 0x20, %g1 d4: 84 10 80 01 or %g2, %g1, %g2 d8: 87 48 00 00 rdhpr %hpstate, %g3 dc: 8f 90 20 01 wrpr 1, %tl e0: 03 00 00 00 sethi %hi(0), %g1 e4: 82 10 60 00 mov %g1, %g1 ! 0x0 e8: 83 28 70 20 sllx %g1, 0x20, %g1 ec: 23 00 00 00 sethi %hi(0), %l1 f0: a2 14 40 01 or %l1, %g1, %l1 f4: a2 14 60 00 mov %l1, %l1 f8: 83 99 00 00 wrhpr %g4, %htstate fc: 8f 90 20 00 wrpr 0, %tl 100: 90 10 20 00 clr %o0 104: 81 c0 80 00 jmp %g2 108: 81 c0 80 00 jmp %g2 10c: 81 c0 80 00 jmp %g2
rom_harness.binとACCESSES.txt中の逆アセ結果を比べました。
c: e2 f0 08 a0 stxa %l1, [ %g0 ] (69) # rom_harness.bin 00000400f0: e2 f0 08 a0 stxa %l1, [ %g0 ] (69) # ACCESSES.txt
同じバイナリが同じ命令に逆アセできています。