シンボルグリフ?

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_LOOSSHT_HIOSSHT_LOPROCSHT_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

同名のフィールドの順番が全然違うことに気をつける。

Elf32_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;

Elf64_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;