libc無しにHello World
[やりたいこと]
・なるべく小さな実行ファイル(バイナリ)を作る
・そして、そのバイナリでアセンブラの勉強をする
[環境]
・CentOS7 x64
[Cソースコード]
以下のWikiの「標準Cライブラリなし」ソースをそのまま使わせてもらいました。
・エントリポイントとなる関数は _start()という決まりがある
・その他の関数 _exit(), write()はインラインアセンブラで書かれている
現状、インラインアセンブラで何が書いているのか、理解していないです。
[コンパイル]
コンパイルは書かれている通りのコマンドでできました。
-Osを付けてアセンブラの最適化、-Wl,-sを付けてstripして、それぞれ容量が小さくなることも確認しました。
[逆アセンブル]
[root@cent7 ]# objdump -d -Mintel nostdlib nostdlib: ファイル形式 elf64-x86-64 セクション .text の逆アセンブル: 000000000040010c: 40010c: 55 push rbp 40010d: 48 89 e5 mov rbp,rsp 400110: 48 89 7d f8 mov QWORD PTR [rbp-0x8],rdi 400114: 48 89 75 f0 mov QWORD PTR [rbp-0x10],rsi 400118: 48 89 55 e8 mov QWORD PTR [rbp-0x18],rdx 40011c: 48 8b 4d f8 mov rcx,QWORD PTR [rbp-0x8] 400120: 4c 8b 45 f0 mov r8,QWORD PTR [rbp-0x10] 400124: 4c 8b 4d e8 mov r9,QWORD PTR [rbp-0x18] 400128: 48 c7 c0 01 00 00 00 mov rax,0x1 40012f: 48 89 cf mov rdi,rcx 400132: 4c 89 c6 mov rsi,r8 400135: 4c 89 ca mov rdx,r9 400138: 0f 05 syscall 40013a: 5d pop rbp 40013b: c3 ret 000000000040013c <_exit>: 40013c: 55 push rbp 40013d: 48 89 e5 mov rbp,rsp 400140: 48 89 7d f8 mov QWORD PTR [rbp-0x8],rdi 400144: 48 8b 55 f8 mov rdx,QWORD PTR [rbp-0x8] 400148: 48 c7 c0 3c 00 00 00 mov rax,0x3c 40014f: 48 89 d7 mov rdi,rdx 400152: 0f 05 syscall 400154: 5d pop rbp 400155: c3 ret 0000000000400156 <_start>: 400156: 55 push rbp 400157: 48 89 e5 mov rbp,rsp 40015a: ba 0e 00 00 00 mov edx,0xe 40015f: be 7a 01 40 00 mov esi,0x40017a 400164: bf 01 00 00 00 mov edi,0x1 400169: e8 9e ff ff ff call 40010c 40016e: bf 00 00 00 00 mov edi,0x0 400173: e8 c4 ff ff ff call 40013c <_exit> 400178: 5d pop rbp 400179: c3 ret
[ダンプ]
[root@cent7 ]# od -Ax -tx1z nostdlib 000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 >.ELF............< 000010 02 00 3e 00 01 00 00 00 56 01 40 00 00 00 00 00 >..>.....V.@.....< 000020 40 00 00 00 00 00 00 00 f8 03 00 00 00 00 00 00 >@...............< 000030 00 00 00 00 40 00 38 00 03 00 40 00 09 00 06 00 >....@.8...@.....< 000040 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 >................< 000050 00 00 40 00 00 00 00 00 00 00 40 00 00 00 00 00 >..@.......@.....< 000060 08 02 00 00 00 00 00 00 08 02 00 00 00 00 00 00 >................< 000070 00 00 20 00 00 00 00 00 04 00 00 00 04 00 00 00 >.. .............< 000080 e8 00 00 00 00 00 00 00 e8 00 40 00 00 00 00 00 >..........@.....< 000090 e8 00 40 00 00 00 00 00 24 00 00 00 00 00 00 00 >..@.....$.......< 0000a0 24 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 >$...............< 0000b0 51 e5 74 64 06 00 00 00 00 00 00 00 00 00 00 00 >Q.td............< 0000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................< * 0000e0 10 00 00 00 00 00 00 00 04 00 00 00 14 00 00 00 >................< 0000f0 03 00 00 00 47 4e 55 00 7a 05 6c f3 61 6a 18 92 >....GNU.z.l.aj..< 000100 6c c7 09 08 8b f5 53 1f b5 fd 2b db 55 48 89 e5 >l.....S...+.UH..< 000110 48 89 7d f8 48 89 75 f0 48 89 55 e8 48 8b 4d f8 >H.}.H.u.H.U.H.M.< 000120 4c 8b 45 f0 4c 8b 4d e8 48 c7 c0 01 00 00 00 48 >L.E.L.M.H......H< 000130 89 cf 4c 89 c6 4c 89 ca 0f 05 5d c3 55 48 89 e5 >..L..L....].UH..< 000140 48 89 7d f8 48 8b 55 f8 48 c7 c0 3c 00 00 00 48 >H.}.H.U.H..<...H< 000150 89 d7 0f 05 5d c3 55 48 89 e5 ba 0e 00 00 00 be >....].UH........< 000160 7a 01 40 00 bf 01 00 00 00 e8 9e ff ff ff bf 00 >z.@.............< 000170 00 00 00 e8 c4 ff ff ff 5d c3 48 65 6c 6c 6f 2c >........].Hello,< 000180 20 77 6f 72 6c 64 21 0a 00 00 00 00 00 00 00 00 > world!.........< 000190 14 00 00 00 00 00 00 00 01 7a 52 00 01 78 10 01 >.........zR..x..< 0001a0 1b 0c 07 08 90 01 00 00 1c 00 00 00 1c 00 00 00 >................< 0001b0 5c ff ff ff 30 00 00 00 00 41 0e 10 86 02 43 0d >\...0....A....C.< 0001c0 06 6b 0c 07 08 00 00 00 1c 00 00 00 3c 00 00 00 >.k..........<...< 0001d0 6c ff ff ff 1a 00 00 00 00 41 0e 10 86 02 43 0d >l........A....C.< 0001e0 06 55 0c 07 08 00 00 00 1c 00 00 00 5c 00 00 00 >.U..........\...< 0001f0 66 ff ff ff 24 00 00 00 00 41 0e 10 86 02 43 0d >f...$....A....C.< 000200 06 5f 0c 07 08 00 00 00 47 43 43 3a 20 28 47 4e >._......GCC: (GN< 000210 55 29 20 34 2e 38 2e 35 20 32 30 31 35 30 36 32 >U) 4.8.5 2015062< 000220 33 20 28 52 65 64 20 48 61 74 20 34 2e 38 2e 35 >3 (Red Hat 4.8.5< 000230 2d 31 31 29 00 00 2e 73 79 6d 74 61 62 00 2e 73 >-11)...symtab..s< 000240 74 72 74 61 62 00 2e 73 68 73 74 72 74 61 62 00 >trtab..shstrtab.< 000250 2e 6e 6f 74 65 2e 67 6e 75 2e 62 75 69 6c 64 2d >.note.gnu.build-< 000260 69 64 00 2e 74 65 78 74 00 2e 72 6f 64 61 74 61 >id..text..rodata< 000270 00 2e 65 68 5f 66 72 61 6d 65 00 2e 63 6f 6d 6d >..eh_frame..comm< 000280 65 6e 74 00 00 00 00 00 00 00 00 00 00 00 00 00 >ent.............< 000290 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................< 0002a0 00 00 00 00 03 00 01 00 e8 00 40 00 00 00 00 00 >..........@.....< 0002b0 00 00 00 00 00 00 00 00 00 00 00 00 03 00 02 00 >................< 0002c0 0c 01 40 00 00 00 00 00 00 00 00 00 00 00 00 00 >..@.............< 0002d0 00 00 00 00 03 00 03 00 7a 01 40 00 00 00 00 00 >........z.@.....< 0002e0 00 00 00 00 00 00 00 00 00 00 00 00 03 00 04 00 >................< 0002f0 90 01 40 00 00 00 00 00 00 00 00 00 00 00 00 00 >..@.............< 000300 00 00 00 00 03 00 05 00 00 00 00 00 00 00 00 00 >................< 000310 00 00 00 00 00 00 00 00 01 00 00 00 04 00 f1 ff >................< 000320 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................< 000330 0c 00 00 00 02 00 02 00 0c 01 40 00 00 00 00 00 >..........@.....< 000340 30 00 00 00 00 00 00 00 12 00 00 00 02 00 02 00 >0...............< 000350 3c 01 40 00 00 00 00 00 1a 00 00 00 00 00 00 00 ><.@.............< 000360 18 00 00 00 12 00 02 00 56 01 40 00 00 00 00 00 >........V.@.....< 000370 24 00 00 00 00 00 00 00 1f 00 00 00 10 00 04 00 >$...............< 000380 00 10 60 00 00 00 00 00 00 00 00 00 00 00 00 00 >..`.............< 000390 2b 00 00 00 10 00 04 00 00 10 60 00 00 00 00 00 >+.........`.....< 0003a0 00 00 00 00 00 00 00 00 32 00 00 00 10 00 04 00 >........2.......< 0003b0 00 10 60 00 00 00 00 00 00 00 00 00 00 00 00 00 >..`.............< 0003c0 00 6e 6f 73 74 64 6c 69 62 2e 63 00 77 72 69 74 >.nostdlib.c.writ< 0003d0 65 00 5f 65 78 69 74 00 5f 73 74 61 72 74 00 5f >e._exit._start._< 0003e0 5f 62 73 73 5f 73 74 61 72 74 00 5f 65 64 61 74 >_bss_start._edat< 0003f0 61 00 5f 65 6e 64 00 00 00 00 00 00 00 00 00 00 >a._end..........< 000400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................< * 000430 00 00 00 00 00 00 00 00 1b 00 00 00 07 00 00 00 >................< 000440 02 00 00 00 00 00 00 00 e8 00 40 00 00 00 00 00 >..........@.....< 000450 e8 00 00 00 00 00 00 00 24 00 00 00 00 00 00 00 >........$.......< 000460 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 >................< 000470 00 00 00 00 00 00 00 00 2e 00 00 00 01 00 00 00 >................< 000480 06 00 00 00 00 00 00 00 0c 01 40 00 00 00 00 00 >..........@.....< 000490 0c 01 00 00 00 00 00 00 6e 00 00 00 00 00 00 00 >........n.......< 0004a0 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 >................< 0004b0 00 00 00 00 00 00 00 00 34 00 00 00 01 00 00 00 >........4.......< 0004c0 02 00 00 00 00 00 00 00 7a 01 40 00 00 00 00 00 >........z.@.....< 0004d0 7a 01 00 00 00 00 00 00 0f 00 00 00 00 00 00 00 >z...............< 0004e0 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 >................< 0004f0 00 00 00 00 00 00 00 00 3c 00 00 00 01 00 00 00 >........<.......< 000500 02 00 00 00 00 00 00 00 90 01 40 00 00 00 00 00 >..........@.....< 000510 90 01 00 00 00 00 00 00 78 00 00 00 00 00 00 00 >........x.......< 000520 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 >................< 000530 00 00 00 00 00 00 00 00 46 00 00 00 01 00 00 00 >........F.......< 000540 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >0...............< 000550 08 02 00 00 00 00 00 00 2d 00 00 00 00 00 00 00 >........-.......< 000560 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 >................< 000570 01 00 00 00 00 00 00 00 11 00 00 00 03 00 00 00 >................< 000580 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................< 000590 35 02 00 00 00 00 00 00 4f 00 00 00 00 00 00 00 >5.......O.......< 0005a0 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 >................< 0005b0 00 00 00 00 00 00 00 00 01 00 00 00 02 00 00 00 >................< 0005c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................< 0005d0 88 02 00 00 00 00 00 00 38 01 00 00 00 00 00 00 >........8.......< 0005e0 08 00 00 00 09 00 00 00 08 00 00 00 00 00 00 00 >................< 0005f0 18 00 00 00 00 00 00 00 09 00 00 00 03 00 00 00 >................< 000600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................< 000610 c0 03 00 00 00 00 00 00 37 00 00 00 00 00 00 00 >........7.......< 000620 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 >................< 000630 00 00 00 00 00 00 00 00 >........< 000638
[コードセクション]
[root@cent7 ]# readelf -S nostdlib 9 個のセクションヘッダ、始点オフセット 0x3f8: セクションヘッダ: [番] 名前 タイプ アドレス オフセット サイズ EntSize フラグ Link 情報 整列 [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] .note.gnu.build-i NOTE 00000000004000e8 000000e8 0000000000000024 0000000000000000 A 0 0 4 [ 2] .text PROGBITS 000000000040010c 0000010c 000000000000006e 0000000000000000 AX 0 0 1 [ 3] .rodata PROGBITS 000000000040017a 0000017a 000000000000000f 0000000000000000 A 0 0 1 [ 4] .eh_frame PROGBITS 0000000000400190 00000190 0000000000000078 0000000000000000 A 0 0 8 [ 5] .comment PROGBITS 0000000000000000 00000208 000000000000002d 0000000000000001 MS 0 0 1 [ 6] .shstrtab STRTAB 0000000000000000 00000235 000000000000004f 0000000000000000 0 0 1 [ 7] .symtab SYMTAB 0000000000000000 00000288 0000000000000138 0000000000000018 8 9 8 [ 8] .strtab STRTAB 0000000000000000 000003c0 0000000000000037 0000000000000000 0 0 1 フラグのキー: W (write), A (alloc), X (実行), M (merge), S (文字列), l (large) I (情報), L (リンク順), G (グループ), T (TLS), E (排他), x (不明) O (追加の OS 処理が必要) o (OS 固有), p (プロセッサ固有)
[ToDo]
・インラインアセンブラを理解する