リンカーとライブラリ

役に立つツール

性能について述べる前に、使用可能なツールのいくつかと ELF ファイルの内容の解析に対するその使用法を理解しておくと役に立ちます。

ELF ファイルに定義されているセクションまたはセグメントのいずれかのサイズに対する参照は、頻繁に行われます (ELF 形式の詳細については、第 7 章「オブジェクトファイル」を参照)。ファイルのサイズは、size(1) コマンドを使用して表示できます。次に例を示します。


$ size -x libfoo.so.1
59c + 10c + 20 = 0x6c8$ 

size -xf libfoo.so.1
..... + 1c(.init) + ac(.text) + c(.fini) + 4(.rodata) + ¥
..... + 18(.data) + 20(.bss) .....

最初の例は、SunOS オペレーティングシステムの以前のリリースから引き続き使用されてきたカテゴリである、共有オブジェクトテキスト、データ、および bss のサイズを示します。ELF 形式は、データをセクションに編成することによって、ファイル内のデータを表現するためのより精密な方法を提供します。2 番目の例は、ファイルの読み込み可能な各セクションのサイズを表示しています。

セクションは、セグメントと呼ばれる単位に割り当てられます。セグメントの一部は、ファイルの部分がメモリにどのように割り当てられるかを記述します。これらの読み込み可能セグメントは、dump(1) コマンドを使用して、LOAD エントリを調べることによって表示できます。次に例を示します。


$ dump -ov libfoo.so.1libfoo.so.1:
 ***** PROGRAM EXECUTION HEADER *****
Type        Offset      Vaddr       Paddr
Filesz      Memsz       Flags       Align

LOAD        0x94        0x94        0x0
0x59c       0x59c       r-x         0x10000

LOAD        0x630       0x10630     0x0
0x10c       0x12c       rwx         0x10000

ここで、共有オブジェクト libfoo.so.1 には、一般にテキストセグメントおよびデータセグメントと呼ばれる 2 つのセグメントがあります。テキストセグメントは、その内容の読み取りと実行 (r-x) が可能になるように割り当てられます。これに対して、データセグメントは、その内容の変更 (rwx) が可能になるように割り当てられます。データセグメントのメモリサイズ (Memsz) が、ファイルサイズ (Filesz) とは異なることに注意してください。この違いは、実際にはデータセグメントの一部である .bss セクションを示すものです。

ただし、通常プログラマは、関数とデータ要素をそのコード内に定義するシンボルの点からファイルについて考えます。これらのシンボルは、nm(1) を使用して表示できます。次に例を示します。


$ nm -x libfoo.so.1
[Index]   Value      Size      Type  Bind  Other Shndx   Name
.........
[39]    |0x00000538|0x00000000|FUNC |GLOB |0x0  |7      |_init
[40]    |0x00000588|0x00000034|FUNC |GLOB |0x0  |8      |foo
[41]    |0x00000600|0x00000000|FUNC |GLOB |0x0  |9      |_fini
[42]    |0x00010688|0x00000010|OBJT |GLOB |0x0  |13     |data
[43]    |0x0001073c|0x00000020|OBJT |GLOB |0x0  |16     |bss
.........

シンボルを含むセクションは、シンボルテーブルのセクションインデックス (Shndx) フィールドを参照し、dump(1) を使用してファイル内のセクションを表示することによって判定できます。次に例を示します。


$ dump -hv libfoo.so.1
libfoo.so.1:
           **** SECTION HEADER TABLE ****
[No]    Type    Flags   Addr      Offset    Size      Name
.........
[7]     PBIT    -AI     0x538     0x538     0x1c      .init

[8]     PBIT    -AI     0x554     0x554     0xac      .text

[9]     PBIT    -AI     0x600     0x600     0xc       .fini
.........
[13]    PBIT    WA-     0x10688   0x688     0x18      .data

[16]    NOBI    WA-     0x1073c   0x73c     0x20      .bss
.........

前出の nm(1) および dump(1) の例による出力を使用すると、セクション.init.text および .fini に対する関数_initfoo、および_fini の関連付けが見られます。これらのセクションは読み取り専用であるため、テキストセグメントの一部です。

同様に、データ配列 databss は、それぞれセクション .data.bss に関連付けられています。これらのセクションは書き込み可能であるため、データセグメントの一部です。


注 -

前出の dump(1) の表示は例のために簡素化されています。


ここで説明したツール情報を利用すると、生成するすべての ELF ファイル内でのコードおよびデータの位置を解析できます。この知識は、次の節での説明を理解するうえで役立ちます。