C 符號表匯出

2022-02-19 14:46:05 字數 3471 閱讀 3332

編譯符號表匯出示例:

使用gcc編譯鏈結引數--version-script 控制動態符號表,如想

使用鏈結引數 --retain-symbols-file 控制靜態符號表,--version-script 控制動態符號表,後面都是接含有匯出符號的檔案的名字。這兩個引數在移植windows下的動態庫很有用,windows下的def檔案能控制匯出符號,我們可以在linux下的構建指令碼中解析def生成乙個匯出符號檔案,然後作為retain-symbols-file,version-script的引數。示例如下:

這是a1.c檔案

[cpp]

#include 

#include 

voidfunc_1()  

voidfunc_2()  

10.   

13.   

14.voidfunc_3()  

15.   

這是a1.sym檔案,控制靜態匯出符號

[cpp]

func_1  

func_3  

這是a1.map檔案,控制動態匯出符號

global表示要匯出的符號,local表示不匯出的,*表示都不匯出

[cpp]

;  生成共享庫

[cpp]

gcc a1.c -shared -o liba1.so -wl,--retain-symbols-file=a1.sym -wl,--version-script=a1.map  

檢視符號表:

readelf -s liba1.so  

symbol table '.dynsym' contains 7 entries:  

num:    value  size type    bind   vis      ndx name  

0: 00000000     0 notype  local  default  und   

1: 00000000     0 func    weak   default  und __cxa_finalize@glibc_2.1.3 (2)  

2: 00000000     0 func    global default  und puts@glibc_2.0 (3)  

3: 00000000     0 notype  weak   default  und __gmon_start__  

4: 00000000     0 notype  weak   default  und _jv_registerclasses  

5: 00000400    20 func    global default   11 func_2  

6: 000003ec    20 func    global default   11 func_1  

10.   

11.   

12. symbol table '.symtab' contains 27 entries:  

13.    num:    value  size type    bind   vis      ndx name  

14.      0: 00000000     0 notype  local  default  und   

15.      1: 00000114     0 section local  default    1   

16.      2: 00000138     0 section local  default    2   

17.      3: 0000015c     0 section local  default    3   

18.      4: 000001cc     0 section local  default    4   

19.      5: 00000232     0 section local  default    5   

20.      6: 00000240     0 section local  default    6   

21.      7: 00000270     0 section local  default    7   

22.      8: 000002c0     0 section local  default    8   

23.      9: 000002d0     0 section local  default    9   

24.     10: 00000300     0 section local  default   10   

25.     11: 00000330     0 section local  default   11   

26.     12: 00000468     0 section local  default   12   

27.     13: 00000482     0 section local  default   13   

28.     14: 000004ac     0 section local  default   14   

29.     15: 000004d8     0 section local  default   15   

30.     16: 00001f0c     0 section local  default   16   

31.     17: 00001f14     0 section local  default   17   

32.     18: 00001f1c     0 section local  default   18   

33.     19: 00001f20     0 section local  default   19   

34.     20: 00001fe8     0 section local  default   20   

35.     21: 00001ff4     0 section local  default   21   

36.     22: 00002008     0 section local  default   22   

37.     23: 0000200c     0 section local  default   23   

38.     24: 00000000     0 section local  default   24   

39.     25: 00000414    20 func    local  default   11 func_3  

40.     26: 000003ec    20 func    global default   11 func_1  

顯而易見:動態符號表中是函式func_2,func_1,靜態符號表中是func_3,func_1

未解決符號表,匯出符號表和位址重定向表

讓我們總結一下 編譯器把乙個cpp編譯為目標檔案的時候,除了要在目標檔案裡寫入cpp裡包含的資料和 還要至少提供3個表 未解決符號表,匯出符號表和位址重定向表。未解決符號表提供了所有在該編譯單元裡引用但是定義並不在本編譯單元裡的符號及其出現的位址。匯出符號表提供了本編譯單元具有定義,並且願意提供給其...

16 驅動模組的符號表與符號匯出

檢視elf檔案的資訊 readelf test.ko a ko檔案組成 1 elf檔案頭 elf header magic 7f 45 4c 46 0101 0100 0000 0000 0000 0000 class elf32 data 2 s complement,little endian ...

邏輯符號表

邏輯符號表 跳轉到 導航,搜尋 在邏輯中,經常使用一組符號來表達邏輯結構。因為邏輯學家非常熟悉這些符號,他們在使用的時候沒有解釋它們。所以,給學邏輯的人的下列 列出了最常用的符號 它們的名字 讀法和有關的數學領域。此外,第三列包含非正式定義,第四列給出簡短的例子。要注意,在一些情況下,不同的符號有相...