e-tipsmemo

ごった煮

objcopyで textセクションの抽出

諸事情があって自分の書いたMIPSアセンブリを純粋に機械語に変換しただけの16進数表示のテキストが
ほしいという状況になった。
今回はMIPSでそういう状況だったがgccを使っているのでアセンブラのところを切り替えれば
x86でもx64でもarmでもなんでも同様の手順でできると思う。

準備

UbuntuやWSLなどを想定している。

$ sudo apt-get install gcc-mips-linux-gnu

50MB近くあるので待つ。

アセンブリコードを用意する。

ラベルも追加しておけばループできる

addi $3, $0, 5
addi $4, $0, 0
L: addi $4, $4, 1
BNE $3, $4, L
nop
nop
nop
....

nopは00000000となる

アセンブラする
$ mips-linux-gnu-as source.s -o source

これは色々と別のセクションやelfヘッダもくっついている

$ mips-linux-gnu-objdump source -h
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00004010  00000000  00000000  00000040  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00000000  00000000  00004050  2**4
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00004050  2**4
                  ALLOC
  3 .reginfo      00000018  00000000  00000000  00004050  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA, LINK_ONCE_SAME_SIZE
  4 .MIPS.abiflags 00000018  00000000  00000000  00004068  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA, LINK_ONCE_SAME_SIZE
  5 .pdr          00000000  00000000  00000000  00004080  2**2
                  CONTENTS, READONLY
  6 .gnu.attributes 00000010  00000000  00000000  00004080  2**0
                  CONTENTS, READONLY

バイナリを直接表示

$ xxd source
textセクション抽出
$ mips-linux-gnu-objcopy -O binary --only-section=.text ./source ./source.bin
$ xxd source.bin
16進数テキストにする

出力したいフォーマットによってオプションの数字を変える必要がある。

$ xxd -ps -c 4 source.bin > program.hex

-c 4.. 4byte(32bit)単位で表示

$ cat program.hex | head
20030005
20040000
20840001
1464fffe
00000000
00000000
00000000
00000000
00000000
00000000