『12ステップで作る組み込みOS自作入門』という本を読み進めていて、その中に出てくるMakefileの書き方に疑問を持ちました。Makefileの中ではオブジェクトファイルを次のようにOBJSというターゲットにまとめにしていました。
OBJS = vector.o startup.o main.o OBJS += lib.o serial.o xmodem.o
しかし、リンク時には呼び出されるファイルを呼び出すファイルより右に置かなくてはならないはずです。言い換えれば次のように書かなければならないはずです。
OBJS = vector.o startup.o main.o OBJS += xmodem.o lib.o serial.o
しかし、実際に上の方のMakefileでビルドが通ります。これはなぜでしょうか。
実は呼び出されるファイルを右に書かなくてはならないというのは 静的ライブラリをリンクする時のルール であって、オブジェクトファイルをリンクするときは当てはまらないそうです。
じゃあそもそもオブジェクトファイルと静的ライブラリの違いって何だっけと調べた結果、
ということに落ち着きました。
では、1オブジェクトファイルを静的ライブラリ化したものは元のオブジェクトファイルと同じなのでしょうか?この2つのファイルをhexdumpコマンドで覗いてみましょう。
まず、xmodem.oをhexdumpした結果がこちらです。
$ /usr/local/h8300-elf/bin/gcc -c xmodem.c -Wall -mh -nostdinc -nostdlib -fno-builtin /tmp/ccqjFKQ7.s: Assembler messages: /tmp/ccqjFKQ7.s:50: Warning: operand #0xffffffffffffffff out of range. /tmp/ccqjFKQ7.s:63: Warning: operand #0xffffffffffffffff out of range. $ hexdump xmodem.o 0000000 457f 464c 0201 0001 0000 0000 0000 0000 0000010 0100 2e00 0000 0100 0000 0000 0000 0000 0000020 0000 d402 8100 0000 3400 0000 0000 2800 . . . 0000800 0000 4202 0000 1f16 0000 0000 0000 4f02 0000810 0000 2013 0000 0000 0000818
次に、xmodem.aをhexdumpした結果がこちらです。
$ /usr/local/h8300-elf/bin/ar -r xmodem.a xmodem.o $ hexdump xmodem.a 0000000 3c21 7261 6863 0a3e 202f 2020 2020 2020 0000010 2020 2020 2020 2020 3631 3834 3739 3933 0000020 3432 2020 2030 2020 2020 2030 2020 2020 . . . 0000890 1f16 0000 0000 0000 4202 0000 1f16 0000 00008a0 0000 0000 4f02 0000 2013 0000 0000 00008ae
ということで、xmodem.oモジュールしか含んでいなくとも、xmodem.aはxmodem.oと異なるファイルであることがわかりました。特に、xmodem.oはelf形式のマジックナンバー(0x7f 0x45)から始まっているのに対し、xmodem.aは0x21 0x3c という値から始まっていますね。静的ライブラリにもヘッダがあるのでしょうか。
試し半分にxmodem.aをいろいろなコマンドで解析してみましょう。
readelfコマンド
$ readelf -a xmodem.a ファイル: xmodem.a(xmodem.o) ELF ヘッダ: マジック: 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00 クラス: ELF32 データ: 2 の補数、ビッグエンディアン バージョン: 1 (current) OS/ABI: UNIX - System V ABI バージョン: 0 型: REL (再配置可能ファイル) マシン: Renesas H8/300 . . . 24: 00000000 0 NOTYPE GLOBAL DEFAULT UND _serial_send_byte 25: 00000000 0 NOTYPE GLOBAL DEFAULT UND _serial_recv_byte 26: 0000014c 290 NOTYPE GLOBAL DEFAULT 1 _xmodem_recv このファイルからはバージョン情報が見つかりません。
nmコマンド
$ nm xmodem.a xmodem.o: 00000134 t .L11 0000025c t .L12 00000172 t .L13 00000250 t .L14 0000017e t .L15 000001a2 t .L16 000001b8 t .L18 00000010 t .L2 0000023a t .L20 000001f6 t .L21 00000048 t .L3 0000013c t .L5 00000090 t .L6 000000b8 t .L7 000000c4 t .L8 0000010e t .L9 U _serial_is_recv_enable U _serial_recv_byte U _serial_send_byte 00000054 t _xmodem_read_block 0000014c T _xmodem_recv 00000000 t _xmodem_wait
objdumpコマンド
$ objdump -r xmodem.a 書庫 xmodem.a 内: xmodem.o: ファイル形式 elf32-big RELOCATION RECORDS FOR [.text]: OFFSET TYPE VALUE 00000015 UNKNOWN _serial_is_recv_enable 0000001d UNKNOWN .L3 00000033 UNKNOWN .L2 00000043 UNKNOWN _serial_send_byte 00000047 UNKNOWN .L2 0000006f UNKNOWN _serial_recv_byte 00000083 UNKNOWN .L6 0000008e UNKNOWN .L5 00000095 UNKNOWN _serial_recv_byte 000000ab UNKNOWN .L7 000000b6 UNKNOWN .L5 000000cd UNKNOWN .L9 000000d3 UNKNOWN _serial_recv_byte 0000010d UNKNOWN .L8 00000113 UNKNOWN _serial_recv_byte 00000129 UNKNOWN .L11 00000133 UNKNOWN .L5 00000179 UNKNOWN .L15 0000017b UNKNOWN _xmodem_wait 00000183 UNKNOWN _serial_recv_byte 00000193 UNKNOWN .L16 0000019b UNKNOWN _serial_send_byte 000001a0 UNKNOWN .L14 000001a9 UNKNOWN .L18 000001b6 UNKNOWN .L12 000001c0 UNKNOWN .L20 000001d7 UNKNOWN _xmodem_read_block 000001e7 UNKNOWN .L21 000001ef UNKNOWN _serial_send_byte 000001f4 UNKNOWN .L13 00000233 UNKNOWN _serial_send_byte 00000238 UNKNOWN .L13 00000242 UNKNOWN .L13 0000024f UNKNOWN .L12
以上の結果から察するに、静的ライブラリは各モジュール(オブジェクトファイル)ごとに情報を格納しているみたいでね。つまり、いざとなれば特定のモジュールだけ切り出すことができるようです。
実際にteratail-静的ライブラリ.aとオブジェクトファイル.oの違いがわからない によると、静的ライブラリをリンクした場合、実行可能ファイルには実際に必要なモジュール(オブジェクトファイル)のみがリンクされるとのこと。
このことを確かめるために、main.c, hoge.c, fuga.c という3つのファイルを用意しました。
main.c
#include<stdio.h> extern int hoge(); extern int fuga(); int main() { hoge(); //fuga(); あえてコメントアウトさせておく return 0; }
hoge.c
#include<stdio.h> int hoge() { printf("hoge\n"); return 0; }
fuga.c
#include<stdio.h> int fuga() { printf("fuga\n"); return 0; }
main.cはhoge()しか呼び出しておらず、fuga.oは不要ということになります。
まずは静的ライブラリを使わずナイーブにビルドしてできたelfファイルを見てみましょう
$ gcc hoge.c fuga.c main.c $ readelf -a a.out . . . Symbol table '.symtab' contains 67 entries: 番号: 値 サイズ タイプ Bind Vis 索引名 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000238 0 SECTION LOCAL DEFAULT 1 2: 0000000000000254 0 SECTION LOCAL DEFAULT 2 3: 0000000000000274 0 SECTION LOCAL DEFAULT 3 4: 0000000000000298 0 SECTION LOCAL DEFAULT 4 5: 00000000000002b8 0 SECTION LOCAL DEFAULT 5 6: 0000000000000360 0 SECTION LOCAL DEFAULT 6 7: 00000000000003e2 0 SECTION LOCAL DEFAULT 7 8: 00000000000003f0 0 SECTION LOCAL DEFAULT 8 9: 0000000000000410 0 SECTION LOCAL DEFAULT 9 10: 00000000000004d0 0 SECTION LOCAL DEFAULT 10 11: 00000000000004e8 0 SECTION LOCAL DEFAULT 11 12: 0000000000000500 0 SECTION LOCAL DEFAULT 12 13: 0000000000000520 0 SECTION LOCAL DEFAULT 13 14: 0000000000000530 0 SECTION LOCAL DEFAULT 14 15: 00000000000006f4 0 SECTION LOCAL DEFAULT 15 16: 0000000000000700 0 SECTION LOCAL DEFAULT 16 17: 0000000000000710 0 SECTION LOCAL DEFAULT 17 18: 0000000000000760 0 SECTION LOCAL DEFAULT 18 19: 0000000000200db8 0 SECTION LOCAL DEFAULT 19 20: 0000000000200dc0 0 SECTION LOCAL DEFAULT 20 21: 0000000000200dc8 0 SECTION LOCAL DEFAULT 21 22: 0000000000200fb8 0 SECTION LOCAL DEFAULT 22 23: 0000000000201000 0 SECTION LOCAL DEFAULT 23 24: 0000000000201010 0 SECTION LOCAL DEFAULT 24 25: 0000000000000000 0 SECTION LOCAL DEFAULT 25 26: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c 27: 0000000000000560 0 FUNC LOCAL DEFAULT 14 deregister_tm_clones 28: 00000000000005a0 0 FUNC LOCAL DEFAULT 14 register_tm_clones 29: 00000000000005f0 0 FUNC LOCAL DEFAULT 14 __do_global_dtors_aux 30: 0000000000201010 1 OBJECT LOCAL DEFAULT 24 completed.7698 31: 0000000000200dc0 0 OBJECT LOCAL DEFAULT 20 __do_global_dtors_aux_fin 32: 0000000000000630 0 FUNC LOCAL DEFAULT 14 frame_dummy 33: 0000000000200db8 0 OBJECT LOCAL DEFAULT 19 __frame_dummy_init_array_ 34: 0000000000000000 0 FILE LOCAL DEFAULT ABS main.c 35: 0000000000000000 0 FILE LOCAL DEFAULT ABS hoge.c 36: 0000000000000000 0 FILE LOCAL DEFAULT ABS fuga.c 37: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c 38: 00000000000008a4 0 OBJECT LOCAL DEFAULT 18 __FRAME_END__ 39: 0000000000000000 0 FILE LOCAL DEFAULT ABS 40: 0000000000200dc0 0 NOTYPE LOCAL DEFAULT 19 __init_array_end 41: 0000000000200dc8 0 OBJECT LOCAL DEFAULT 21 _DYNAMIC 42: 0000000000200db8 0 NOTYPE LOCAL DEFAULT 19 __init_array_start 43: 0000000000000710 0 NOTYPE LOCAL DEFAULT 17 __GNU_EH_FRAME_HDR 44: 0000000000200fb8 0 OBJECT LOCAL DEFAULT 22 _GLOBAL_OFFSET_TABLE_ 45: 00000000000006f0 2 FUNC GLOBAL DEFAULT 14 __libc_csu_fini 46: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab 47: 0000000000201000 0 NOTYPE WEAK DEFAULT 23 data_start 48: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@@GLIBC_2.2.5 49: 0000000000000666 23 FUNC GLOBAL DEFAULT 14 fuga 50: 0000000000201010 0 NOTYPE GLOBAL DEFAULT 23 _edata 51: 00000000000006f4 0 FUNC GLOBAL DEFAULT 15 _fini 52: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_ 53: 0000000000201000 0 NOTYPE GLOBAL DEFAULT 23 __data_start 54: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ 55: 0000000000201008 0 OBJECT GLOBAL HIDDEN 23 __dso_handle 56: 0000000000000700 4 OBJECT GLOBAL DEFAULT 16 _IO_stdin_used 57: 0000000000000680 101 FUNC GLOBAL DEFAULT 14 __libc_csu_init 58: 0000000000201018 0 NOTYPE GLOBAL DEFAULT 24 _end 59: 0000000000000530 43 FUNC GLOBAL DEFAULT 14 _start 60: 0000000000201010 0 NOTYPE GLOBAL DEFAULT 24 __bss_start 61: 000000000000063a 21 FUNC GLOBAL DEFAULT 14 main 62: 000000000000064f 23 FUNC GLOBAL DEFAULT 14 hoge 63: 0000000000201010 0 OBJECT GLOBAL HIDDEN 23 __TMC_END__ 64: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable 65: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@@GLIBC_2.2 66: 00000000000004e8 0 FUNC GLOBAL DEFAULT 11 _init . . .
この結果から、不要なfugaというシンボルが含まれていることがわかります。
一方、静的ライブラリを用いてビルドしてできたelfファイルの解析結果は以下のようになります。
$ gcc -c main.c hoge.c fuga.c $ ar -r libhogefuga.a hoge.o fuga.o ar: libhogefuga.a を作成しています $ gcc main.o libhogefuga.a $ readelf -a a.out . . . Symbol table '.symtab' contains 65 entries: 番号: 値 サイズ タイプ Bind Vis 索引名 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000238 0 SECTION LOCAL DEFAULT 1 2: 0000000000000254 0 SECTION LOCAL DEFAULT 2 3: 0000000000000274 0 SECTION LOCAL DEFAULT 3 4: 0000000000000298 0 SECTION LOCAL DEFAULT 4 5: 00000000000002b8 0 SECTION LOCAL DEFAULT 5 6: 0000000000000360 0 SECTION LOCAL DEFAULT 6 7: 00000000000003e2 0 SECTION LOCAL DEFAULT 7 8: 00000000000003f0 0 SECTION LOCAL DEFAULT 8 9: 0000000000000410 0 SECTION LOCAL DEFAULT 9 10: 00000000000004d0 0 SECTION LOCAL DEFAULT 10 11: 00000000000004e8 0 SECTION LOCAL DEFAULT 11 12: 0000000000000500 0 SECTION LOCAL DEFAULT 12 13: 0000000000000520 0 SECTION LOCAL DEFAULT 13 14: 0000000000000530 0 SECTION LOCAL DEFAULT 14 15: 00000000000006e4 0 SECTION LOCAL DEFAULT 15 16: 00000000000006f0 0 SECTION LOCAL DEFAULT 16 17: 00000000000006fc 0 SECTION LOCAL DEFAULT 17 18: 0000000000000740 0 SECTION LOCAL DEFAULT 18 19: 0000000000200db8 0 SECTION LOCAL DEFAULT 19 20: 0000000000200dc0 0 SECTION LOCAL DEFAULT 20 21: 0000000000200dc8 0 SECTION LOCAL DEFAULT 21 22: 0000000000200fb8 0 SECTION LOCAL DEFAULT 22 23: 0000000000201000 0 SECTION LOCAL DEFAULT 23 24: 0000000000201010 0 SECTION LOCAL DEFAULT 24 25: 0000000000000000 0 SECTION LOCAL DEFAULT 25 26: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c 27: 0000000000000560 0 FUNC LOCAL DEFAULT 14 deregister_tm_clones 28: 00000000000005a0 0 FUNC LOCAL DEFAULT 14 register_tm_clones 29: 00000000000005f0 0 FUNC LOCAL DEFAULT 14 __do_global_dtors_aux 30: 0000000000201010 1 OBJECT LOCAL DEFAULT 24 completed.7698 31: 0000000000200dc0 0 OBJECT LOCAL DEFAULT 20 __do_global_dtors_aux_fin 32: 0000000000000630 0 FUNC LOCAL DEFAULT 14 frame_dummy 33: 0000000000200db8 0 OBJECT LOCAL DEFAULT 19 __frame_dummy_init_array_ 34: 0000000000000000 0 FILE LOCAL DEFAULT ABS main.c 35: 0000000000000000 0 FILE LOCAL DEFAULT ABS hoge.c 36: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c 37: 0000000000000864 0 OBJECT LOCAL DEFAULT 18 __FRAME_END__ 38: 0000000000000000 0 FILE LOCAL DEFAULT ABS 39: 0000000000200dc0 0 NOTYPE LOCAL DEFAULT 19 __init_array_end 40: 0000000000200dc8 0 OBJECT LOCAL DEFAULT 21 _DYNAMIC 41: 0000000000200db8 0 NOTYPE LOCAL DEFAULT 19 __init_array_start 42: 00000000000006fc 0 NOTYPE LOCAL DEFAULT 17 __GNU_EH_FRAME_HDR 43: 0000000000200fb8 0 OBJECT LOCAL DEFAULT 22 _GLOBAL_OFFSET_TABLE_ 44: 00000000000006e0 2 FUNC GLOBAL DEFAULT 14 __libc_csu_fini 45: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab 46: 0000000000201000 0 NOTYPE WEAK DEFAULT 23 data_start 47: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@@GLIBC_2.2.5 48: 0000000000201010 0 NOTYPE GLOBAL DEFAULT 23 _edata 49: 00000000000006e4 0 FUNC GLOBAL DEFAULT 15 _fini 50: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_ 51: 0000000000201000 0 NOTYPE GLOBAL DEFAULT 23 __data_start 52: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ 53: 0000000000201008 0 OBJECT GLOBAL HIDDEN 23 __dso_handle 54: 00000000000006f0 4 OBJECT GLOBAL DEFAULT 16 _IO_stdin_used 55: 0000000000000670 101 FUNC GLOBAL DEFAULT 14 __libc_csu_init 56: 0000000000201018 0 NOTYPE GLOBAL DEFAULT 24 _end 57: 0000000000000530 43 FUNC GLOBAL DEFAULT 14 _start 58: 0000000000201010 0 NOTYPE GLOBAL DEFAULT 24 __bss_start 59: 000000000000063a 21 FUNC GLOBAL DEFAULT 14 main 60: 000000000000064f 23 FUNC GLOBAL DEFAULT 14 hoge 61: 0000000000201010 0 OBJECT GLOBAL HIDDEN 23 __TMC_END__ 62: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable 63: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@@GLIBC_2.2 64: 00000000000004e8 0 FUNC GLOBAL DEFAULT 11 _init . . .
ライブラリを使わなかった場合で言うところの36、49番目のfugaに関するシンボルが消えていることがわかります。たしかに静的ライブラリをリンクした場合、必要なモジュールのみがリンクされているようです。サイズも若干小さくなっていました。
また、最後になりますがlibhogefuga.aをreadelfで解析した結果が次になります。まるでelfファイルが2つあるかのように振る舞っていることがわかりますね。
$ readelf -a libhogefuga.a ファイル: libhogefuga.a(hoge.o) ELF ヘッダ: マジック: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 クラス: ELF64 データ: 2 の補数、リトルエンディアン バージョン: 1 (current) OS/ABI: UNIX - System V ABI バージョン: 0 型: REL (再配置可能ファイル) マシン: Advanced Micro Devices X86-64 バージョン: 0x1 エントリポイントアドレス: 0x0 プログラムヘッダ始点: 0 (バイト) セクションヘッダ始点: 696 (バイト) フラグ: 0x0 このヘッダのサイズ: 64 (バイト) プログラムヘッダサイズ: 0 (バイト) プログラムヘッダ数: 0 セクションヘッダ: 64 (バイト) セクションヘッダサイズ: 13 セクションヘッダ文字列表索引: 12 セクションヘッダ: [番] 名前 タイプ アドレス オフセット サイズ EntSize フラグ Link 情報 整列 [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] .text PROGBITS 0000000000000000 00000040 0000000000000017 0000000000000000 AX 0 0 1 [ 2] .rela.text RELA 0000000000000000 00000208 0000000000000030 0000000000000018 I 10 1 8 [ 3] .data PROGBITS 0000000000000000 00000057 0000000000000000 0000000000000000 WA 0 0 1 [ 4] .bss NOBITS 0000000000000000 00000057 0000000000000000 0000000000000000 WA 0 0 1 [ 5] .rodata PROGBITS 0000000000000000 00000057 0000000000000005 0000000000000000 A 0 0 1 [ 6] .comment PROGBITS 0000000000000000 0000005c 000000000000002a 0000000000000001 MS 0 0 1 [ 7] .note.GNU-stack PROGBITS 0000000000000000 00000086 0000000000000000 0000000000000000 0 0 1 [ 8] .eh_frame PROGBITS 0000000000000000 00000088 0000000000000038 0000000000000000 A 0 0 8 [ 9] .rela.eh_frame RELA 0000000000000000 00000238 0000000000000018 0000000000000018 I 10 8 8 [10] .symtab SYMTAB 0000000000000000 000000c0 0000000000000120 0000000000000018 11 9 8 [11] .strtab STRTAB 0000000000000000 000001e0 0000000000000028 0000000000000000 0 0 1 [12] .shstrtab STRTAB 0000000000000000 00000250 0000000000000061 0000000000000000 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), I (info), L (link order), O (extra OS processing required), G (group), T (TLS), C (compressed), x (unknown), o (OS specific), E (exclude), l (large), p (processor specific) このファイルにはセクショングループがありません。 このファイルにはプログラムヘッダはありません。 このファイルには動的セクションがありません。 再配置セクション '.rela.text' at offset 0x208 contains 2 entries: オフセット 情報 型 シンボル値 シンボル名 + 加数 000000000007 000500000002 R_X86_64_PC32 0000000000000000 .rodata - 4 00000000000c 000b00000004 R_X86_64_PLT32 0000000000000000 puts - 4 再配置セクション '.rela.eh_frame' at offset 0x238 contains 1 entry: オフセット 情報 型 シンボル値 シンボル名 + 加数 000000000020 000200000002 R_X86_64_PC32 0000000000000000 .text + 0 The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently supported. Symbol table '.symtab' contains 12 entries: 番号: 値 サイズ タイプ Bind Vis 索引名 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 FILE LOCAL DEFAULT ABS hoge.c 2: 0000000000000000 0 SECTION LOCAL DEFAULT 1 3: 0000000000000000 0 SECTION LOCAL DEFAULT 3 4: 0000000000000000 0 SECTION LOCAL DEFAULT 4 5: 0000000000000000 0 SECTION LOCAL DEFAULT 5 6: 0000000000000000 0 SECTION LOCAL DEFAULT 7 7: 0000000000000000 0 SECTION LOCAL DEFAULT 8 8: 0000000000000000 0 SECTION LOCAL DEFAULT 6 9: 0000000000000000 23 FUNC GLOBAL DEFAULT 1 hoge 10: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_ 11: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND puts このファイルからはバージョン情報が見つかりません。 ファイル: libhogefuga.a(fuga.o) ELF ヘッダ: マジック: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 クラス: ELF64 データ: 2 の補数、リトルエンディアン バージョン: 1 (current) OS/ABI: UNIX - System V ABI バージョン: 0 型: REL (再配置可能ファイル) マシン: Advanced Micro Devices X86-64 バージョン: 0x1 エントリポイントアドレス: 0x0 プログラムヘッダ始点: 0 (バイト) セクションヘッダ始点: 696 (バイト) フラグ: 0x0 このヘッダのサイズ: 64 (バイト) プログラムヘッダサイズ: 0 (バイト) プログラムヘッダ数: 0 セクションヘッダ: 64 (バイト) セクションヘッダサイズ: 13 セクションヘッダ文字列表索引: 12 セクションヘッダ: [番] 名前 タイプ アドレス オフセット サイズ EntSize フラグ Link 情報 整列 [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] .text PROGBITS 0000000000000000 00000040 0000000000000017 0000000000000000 AX 0 0 1 [ 2] .rela.text RELA 0000000000000000 00000208 0000000000000030 0000000000000018 I 10 1 8 [ 3] .data PROGBITS 0000000000000000 00000057 0000000000000000 0000000000000000 WA 0 0 1 [ 4] .bss NOBITS 0000000000000000 00000057 0000000000000000 0000000000000000 WA 0 0 1 [ 5] .rodata PROGBITS 0000000000000000 00000057 0000000000000005 0000000000000000 A 0 0 1 [ 6] .comment PROGBITS 0000000000000000 0000005c 000000000000002a 0000000000000001 MS 0 0 1 [ 7] .note.GNU-stack PROGBITS 0000000000000000 00000086 0000000000000000 0000000000000000 0 0 1 [ 8] .eh_frame PROGBITS 0000000000000000 00000088 0000000000000038 0000000000000000 A 0 0 8 [ 9] .rela.eh_frame RELA 0000000000000000 00000238 0000000000000018 0000000000000018 I 10 8 8 [10] .symtab SYMTAB 0000000000000000 000000c0 0000000000000120 0000000000000018 11 9 8 [11] .strtab STRTAB 0000000000000000 000001e0 0000000000000028 0000000000000000 0 0 1 [12] .shstrtab STRTAB 0000000000000000 00000250 0000000000000061 0000000000000000 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), I (info), L (link order), O (extra OS processing required), G (group), T (TLS), C (compressed), x (unknown), o (OS specific), E (exclude), l (large), p (processor specific) このファイルにはセクショングループがありません。 このファイルにはプログラムヘッダはありません。 このファイルには動的セクションがありません。 再配置セクション '.rela.text' at offset 0x208 contains 2 entries: オフセット 情報 型 シンボル値 シンボル名 + 加数 000000000007 000500000002 R_X86_64_PC32 0000000000000000 .rodata - 4 00000000000c 000b00000004 R_X86_64_PLT32 0000000000000000 puts - 4 再配置セクション '.rela.eh_frame' at offset 0x238 contains 1 entry: オフセット 情報 型 シンボル値 シンボル名 + 加数 000000000020 000200000002 R_X86_64_PC32 0000000000000000 .text + 0 The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently supported. Symbol table '.symtab' contains 12 entries: 番号: 値 サイズ タイプ Bind Vis 索引名 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 FILE LOCAL DEFAULT ABS fuga.c 2: 0000000000000000 0 SECTION LOCAL DEFAULT 1 3: 0000000000000000 0 SECTION LOCAL DEFAULT 3 4: 0000000000000000 0 SECTION LOCAL DEFAULT 4 5: 0000000000000000 0 SECTION LOCAL DEFAULT 5 6: 0000000000000000 0 SECTION LOCAL DEFAULT 7 7: 0000000000000000 0 SECTION LOCAL DEFAULT 8 8: 0000000000000000 0 SECTION LOCAL DEFAULT 6 9: 0000000000000000 23 FUNC GLOBAL DEFAULT 1 fuga 10: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_ 11: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND puts このファイルからはバージョン情報が見つかりません。
まとめ
.oのリンク→順序は関係ないが、不要なものまでリンクしてしまうかも
.aのリンク→順序に注意が必要だが、必要なモジュールのみリンクしてくれる
参考にした『12ステップで作る組み込みOS自作入門』ですが、組み込みOSに限らずLinuxの勉強にもなるので、とてもおすすめです!