ぷるぷるの雑記

低レイヤーがんばるぞいなブログ. 記事のご利用は自己責任で.

gccのリンク時のファイルの順番について

『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つ以上のオブジェクトファイルをまとめたもの

ということに落ち着きました。

では、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の勉強にもなるので、とてもおすすめです!

参考

ambiesoft.com

teratail.com