nm
の出力に登場する, アルファベット1文字のアレの事。
独自定義。
シンボルグリフ | ELF64_ST_BIND | ELF64_ST_TYPE | st_shndx | 説明 |
---|---|---|---|---|
A | * | STT_OBJECT | SHN_ABS | グローバルな絶対シンボル |
Absolute | ||||
a | STB_LOCAL | STT_NOTYPE | SHN_ABS | ローカルな絶対シンボル |
absolute | ||||
B | STB_GLOBAL | STT_OBJECT | SHN_COMMON | グローバルなBSSシンボル |
BSS | ||||
b | STB_LOCAL | STT_OBJECT | SHN_COMMON | ローカルなBSSシンボル |
bss | ||||
C | * | STT_OBJECT | SHN_COMMON | コモンシンボル |
Common | ||||
D | STB_GLOBAL | STT_OBJECT | 参照先がデータセクション | グローバルなデータセクションシンボル |
Data | ||||
d | STB_LOCAL | STT_OBJECT | 参照先がデータセクション | ローカルなデータセクションシンボル |
data | ||||
G | STB_GLOBAL | STT_OBJECT | 参照先がGOTセクション | グローバルなGOTシンボル |
GOT | ||||
g | STB_LOCAL | STT_OBJECT | 参照先がGOTセクション | ローカルなGOTシンボル |
got | ||||
I | * | STT_GNU_IFUNC | * | インディレクト関数シンボル |
Indirect | ||||
N | * | * | SHN_UNDEF | グローバルなデバッグ情報シンボル |
n | STB_LOCAL | STT_NOTYPE | SHN_UNDEF | ローカルなデバッグ情報シンボル |
p | * | STT_OBJECT | 参照先が未定義セクション(SHN_UNDEFではなく?) | スタックまたはその他の未定義セクションシンボル |
R | STB_GLOBAL | STT_OBJECT | 参照先が読み取り専用データセクション | グローバルな読み取り専用データセクションシンボル |
Readonly | ||||
r | STB_LOCAL | STT_OBJECT | 参照先が読み取り専用データセクション | ローカルな読み取り専用データセクションシンボル |
readonly | ||||
S | STB_GLOBAL | STT_OBJECT | 参照先がスモールオブジェクトセクション | グローバルなスモールオブジェクトセクションシンボル |
Small | ||||
s | STB_LOCAL | STT_OBJECT | 参照先がスモールオブジェクトセクション | ローカルなスモールオブジェクトセクションシンボル |
small | ||||
T | STB_GLOBAL | STT_FUNC | 参照先がテキストセクション | グローバルなテキスト(コード)セクションシンボル |
Text | ||||
t | STB_LOCAL | STT_FUNC | 参照先がテキストセクション | ローカルなテキスト(コード)セクションシンボル |
text | ||||
U | STB_GLOBAL | * | SHN_UNDEF | 未定義のシンボル |
Undefined | ||||
V | STB_WEAK | STT_OBJECT | * | グローバルなウィークオブジェクト |
v | STB_WEAK | STT_OBJECT | * | ローカルなウィークオブジェクト |
W | STB_WEAK | STT_FUNC | * | グローバルなウィーク関数 |
w | STB_WEAK | STT_FUNC | * | ローカルなウィーク関数 |
sh_type
sh_type | 意味 | シンボルタイプとの関係 |
---|---|---|
SHT_NULL | セクションヘッダテーブルの未使用エントリを表します。 | フラグが0 → 未定義セクション |
SHT_PROGBITS | プログラムデータ(コードやデータなど)を格納するセクションを表します。 | フラグがSHF_WRITE |
フラグがSHF_WRITE | SHF_ALLOC (かつ セクション名が.data)→ データセクション | |
フラグがSHF_WRITE | SHF_ALLOC | SHF_MERGE → スモールオブジェクトセクション |
フラグがSHF_ALLOC → 読み取り専用データセクション | ||
フラグがSHF_EXECINSTR | SHF_ALLOC → テキストセクション | |
SHT_SYMTAB | シンボルテーブルを格納するセクションを表します。リンク時に使用されます。 | シンボルテーブル。このセクションに所属するシンボルはなさそう。 |
SHT_STRTAB | 文字列テーブルを格納するセクションを表します。シンボル名やセクション名などが含まれます。 | 文字列テーブル。このセクションに所属するシンボルはなさそう。 |
SHT_RELA | 再配置エントリー(アドレス)を格納するセクションを表します。 | |
SHT_HASH | ハッシュテーブルを格納するセクションを表します。シンボルの高速検索に使用されます。 | |
SHT_DYNAMIC | 動的リンク情報を格納するセクションを表します。共有オブジェクトや実行ファイルで使用されます。 | |
SHT_NOTE | 注釈情報を格納するセクションを表します。ABIやAPIの情報などが含まれることがあります。 | |
SHT_NOBITS | 実際のデータが存在しないが、プログラム実行時に割り当てられるべきメモリ領域を示すセクションを表します。BSSセクションがこれに該当します。 | フラグがSHF_WRITE |
SHT_REL | 再配置エントリー(オフセット)を格納するセクションを表します。 | |
SHT_SHLIB | 予約されているが使用されていないセクションタイプです。 | |
SHT_DYNSYM | 動的リンクシンボルテーブルを格納するセクションを表します。共有オブジェクトや実行ファイルで使用されます。 | 動的シンボルテーブル。このセクションに所属するシンボルはなさそう。 |
SHT_INIT_ARRAY | 初期化関数へのポインタ配列を格納するセクションを表します。プログラム開始前に実行されます。 | |
SHT_FINI_ARRAY | 終了関数へのポインタ配列を格納するセクションを表します。プログラム終了後に実行されます。 | |
SHT_PREINIT_ARRAY | 事前初期化関数へのポインタ配列を格納するセクションを表します。プログラム開始前に実行されます。 | |
SHT_GROUP | セクショングループを表します。一連の関連するセクションをまとめるために使用されます。 | |
SHT_SYMTAB_SHNDX | 拡張セクションインデックスを格納するセクションを表します。セクションインデックスが大きすぎる場合に使用されます。 | |
SHT_NUM | セクションタイプの数を表します。これより大きな値は環境固有の意味を持つことがあります。 | |
SHT_LOOS - SHT_HIOS | 環境依存のセクションタイプを表します。これらの範囲の値は、独自のセクションタイプを実装する際に使用されます。 | |
SHT_LOPROC - SHT_HIPROC | プロセッサ固有のセクションタイプを表します。これらの範囲の値は、特定のプロセッサアーキテクチャに依存する独自のセクションタイプを実装する際に使用されます。 |
これらは、**
sh_type
が取りうる一般的な値とその意味を示す表です。 ただし、特定のシステムやアーキテクチャによっては、独自のセクションタイプが追加されることがあります。 これらの値は、通常、SHT_LOOS
~SHT_HIOS
やSHT_LOPROC
~SHT_HIPROC
**の範囲内に定義されます。
sh_flags
名前 | 位置 | 意味 |
---|---|---|
SHF_WRITE | ||
(0x1) | 1 | セクションは書き込み可能です。 |
SHF_ALLOC | ||
(0x2) | 2 | セクションは実行時にメモリに割り当てられる必要があります。 |
SHF_EXECINSTR | ||
(0x4) | 3 | セクションには実行可能なマシン命令が含まれています。 |
SHF_MERGE | ||
(0x10) | 4 | セクションに含まれる同じタイプのデータはマージされることができます。 |
SHF_STRINGS | ||
(0x20) | 5 | セクションにはNULL終端の文字列が含まれています。 |
SHF_INFO_LINK | ||
(0x40) | 6 | セクションのsh_infoフィールドはセクションヘッダテーブルインデックスを保持しています。 |
SHF_LINK_ORDER | ||
(0x80) | 7 | セクションは他のセクションと連結された順序で処理される必要があります。 |
SHF_OS_NONCONFORMING | ||
(0x100) | 8 | セクションはOS固有の処理規則に従わないことを示しています。 |
SHF_GROUP | ||
(0x200) | 9 | セクションはセクショングループのメンバーです。 |
SHF_TLS | ||
(0x400) | 10 | セクションはスレッドローカルストレージに関連付けられています。 |
これらは一般的な
sh_flags
ビットの意味ですが、特定のシステムやアーキテクチャに依存するフラグも存在することがあります。 これらは通常、SHF_MASKOS
,SHF_MASKPROC
などのマスク値で示されます。
値 | 意味 |
---|---|
STB_LOCAL | ローカルバインディング。 |
現在のオブジェクトファイル内でのみ参照可能。 | |
STB_GLOBAL | グローバルバインディング。 |
現在のオブジェクトファイルと他のオブジェクトファイルの両方から参照可能。 | |
STB_WEAK | 弱いバインディング。 |
現在のオブジェクトファイルと他のオブジェクトファイルの両方から参照可能だが、 | |
グローバルシンボルよりも結合の優先度が低い。 |
値 | 意味 |
---|---|
STT_NOTYPE | シンボルの型が指定されていない |
STT_OBJECT | データオブジェクト(変数など)を示すシンボル |
STT_FUNC | 関数または他の実行可能コードを示すシンボル |
STT_SECTION | セクションの名前を示すシンボル |
STT_FILE | ソースファイル名を示すシンボル |
STT_COMMON | 未初期化の共通ブロックを示すシンボル |
STT_TLS | スレッドローカルストレージ変数を示すシンボル |
Elf32_Sym
/ Elf64_Sym
同名のフィールドの順番が全然違うことに気をつける。
typedef struct {
// シンボル名を持つ文字列テーブルセクションのオフセット
Elf32_Word st_name;
// シンボルの値
Elf32_Addr st_value;
// シンボルのサイズ
Elf32_Word st_size;
// シンボルのバインディングとタイプ
unsigned char st_info;
// シンボルの可視性
unsigned char st_other;
// 所属するセクションのインデックス @ セクションヘッダーテーブル
Elf32_Half st_shndx;
} Elf32_Sym;
typedef struct {
// シンボル名を持つ文字列テーブルセクションのオフセット
Elf64_Word st_name;
// シンボルのバインディングとタイプ
unsigned char st_info;
// シンボルの可視性
unsigned char st_other;
// 所属するセクションのインデックス @ セクションヘッダーテーブル
Elf64_Section st_shndx;
// シンボルの値
Elf64_Addr st_value;
// シンボルのサイズ
Elf64_Xword st_size;
} Elf64_Sym;