セクションヘッダの構造を再度復習します。。
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 このシンボルが定義された・関連するセクション番号を示します。