セクションヘッダの構造を再度復習します。。
typedef struct {
Elf32_Word sh_name;
Elf32_Word sh_type;
Elf32_Word sh_flags;
Elf32_Addr sh_addr;
Elf32_Off sh_offset;
Elf32_Word sh_size;
Elf32_Word sh_link;
Elf32_Word sh_info;
Elf32_Word sh_addralign;
Elf32_Word sh_entsize;
} Elf32_Shdr;
この中でsh_typeでそのセクションで定義されているものを指定しています。
そのsh_typeが2の時はシンボルを所持しています。
SHT_SYMTAB 2 シンボルテーブル
さてシンボルとは何なのでしょうか?
→ 簡単に言うと、関数や変数といった名前になります。
そのシンボルを集めたものがシンボルテーブルとなります。
規格で決まっている構造は以下のようになります。
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 ;
1. st_name ここで文字列を指定します。ただし、ここでは数字(オフセット)が定義されています。
そのため、名前を知るためにはストリングテーブルにアクセスする必要があります。
2. st_value アドレスや数値を保持します。
3. st_sizeでサイズを示します。
4. st_info シンボルのタイプとバインディングについて指定します。
具体的には以下の値を持ちます。変数・関数のGLOBAL/LOCALとWeakがタイプとなります。
STB_LOCAL 0
STB_GLOBAL 1
STB_WEAK 2
STB_LOPROC 13
STB_HIPROC 15
5. st_other 通常はゼロです。
6. st_shndx このシンボルが定義された・関連するセクション番号を示します。