1. Symbol Table
在 ELF file 裡, 其中有些 section 它的 type 是 DYNSYM 或 SYMTAB, 裡面含有symbol table,
我們可以用readelf來dump這些symbols, 這邊以簡單的 hello.c 當範例, compile & link 之後
$ readelf --syms hello Symbol table '.dynsym' contains 4 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5 (2) 2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2) 3: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ Symbol table '.symtab' contains 65 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000400238 0 SECTION LOCAL DEFAULT 1 2: 0000000000400254 0 SECTION LOCAL DEFAULT 2 3: 0000000000400274 0 SECTION LOCAL DEFAULT 3 4: 0000000000400298 0 SECTION LOCAL DEFAULT 4 ....
會看到有兩個section有symbol table, 分別是 dynsym 以及 symtab
同樣的事情也可以用nm來做
$ nm hello 0000000000601040 B __bss_start 0000000000601040 b completed.6972 0000000000601030 D __data_start 0000000000601030 W data_start ......
會發現, 用 readelf 讀出來的 symbole item 比較多, 但是 readelf 裡面有不少是空的item, FILE type 的 item 也不會在 nm 裡出現
如果我們將檔案 strip 過, 會發現 symtab 被清掉了
$ strip hello $ nm hello nm: hello: no symbols $ readelf --syms hello Symbol table '.dynsym' contains 4 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5 (2) 2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2) 3: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
2. Symbol type
用 nm dump 出來的 symbol 的 type , 如果是大寫表示global, 小寫表示local
text section
- T : symbol 位於 text section
- D : symbol 位於已初始化的 data section
- G : symbol 位於小物件使用的已初始化 data section. (NOTE: 有些環境用近距離symbol效率較好)
- R : symbol 位於read-only data section
- B : symbol 位於未初始化 data section (BSS)
- S : symbol 位於小物件使用的未初始化 data section
- V : symbol 是 weak object
- W : symbol 是未解析 weak object 的 weak symbol
- C : common symbol, 未初始化資料
- N : debug purpose symbol
- - : symbol 是 a.out object file 的 stabs symbol (for debug information)
- A : symbol 是absolute value, linking的時候不會改變
- U : undefined symbol, instance應該在其它object file或是shared library
- I : Indirect reference symbol, 是a.out 的 GNU extension feature
- ? :