諸事情があって自分の書いたMIPSアセンブリを純粋に機械語に変換しただけの16進数表示のテキストが
ほしいという状況になった。
今回はMIPSでそういう状況だったがgccを使っているのでアセンブラのところを切り替えれば
x86でもx64でもarmでもなんでも同様の手順でできると思う。
アセンブリコードを用意する。
ラベルも追加しておけばループできる
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