C 符号表导出

编译符号表导出示例:

使用GCC编译链接参数--version-script 控制动态符号表,如想

使用链接参数 --retain-symbols-file 控制静态符号表,--version-script 控制动态符号表,后面都是接含有导出符号的文件的名字。这两个参数在移植windows下的动态库很有用,windows下的DEF文件能控制导出符号,我们可以在linux下的构建脚本中解析DEF生成一个导出符号文件,然后作为retain-symbols-file,version-script的参数。示例如下:

这是a1.c文件

[cpp] 

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. void func_1()  
  5. {  
  6.     printf("a1 :: func_1 ");  
  7. }  
  8.   
  9. void func_2()  

10. {  

  1. 11.     printf("a1 :: func_2 ");  

12. }  

  1. 13.   

14. void func_3()  

15. {  

  1. 16.     printf("a1 :: func_3 ");  

17. }  

这是a1.sym文件,控制静态导出符号

[cpp] 

  1. func_1  
  2. func_3  

这是a1.map文件,控制动态导出符号

global表示要导出的符号,local表示不导出的,*表示都不导出

[cpp]

  1. {  
  2. global:  
  3.   func_1;  
  4.   func_2;  
  5. local: *;  
  6. };  

生成共享库

[cpp] 

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

查看符号表:

readelf -s liba1.so  

  1. Symbol table '.dynsym' contains 7 entries:  
  2.    Num:    Value  Size Type    Bind   Vis      Ndx Name  
  3.      0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND   
  4.      1: 00000000     0 FUNC    WEAK   DEFAULT  UND __cxa_finalize@GLIBC_2.1.3 (2)  
  5.      2: 00000000     0 FUNC    GLOBAL DEFAULT  UND puts@GLIBC_2.0 (3)  
  6.      3: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__  
  7.      4: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses  
  8.      5: 00000400    20 FUNC    GLOBAL DEFAULT   11 func_2  
  9.      6: 000003ec    20 FUNC    GLOBAL DEFAULT   11 func_1  
  10. 10.   
  11. 11.   

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

  1. 13.    Num:    Value  Size Type    Bind   Vis      Ndx Name  
  2. 14.      0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND   
  3. 15.      1: 00000114     0 SECTION LOCAL  DEFAULT    1   
  4. 16.      2: 00000138     0 SECTION LOCAL  DEFAULT    2   
  5. 17.      3: 0000015c     0 SECTION LOCAL  DEFAULT    3   
  6. 18.      4: 000001cc     0 SECTION LOCAL  DEFAULT    4   
  7. 19.      5: 00000232     0 SECTION LOCAL  DEFAULT    5   
  8. 20.      6: 00000240     0 SECTION LOCAL  DEFAULT    6   
  9. 21.      7: 00000270     0 SECTION LOCAL  DEFAULT    7   
  10. 22.      8: 000002c0     0 SECTION LOCAL  DEFAULT    8   
  11. 23.      9: 000002d0     0 SECTION LOCAL  DEFAULT    9   
  12. 24.     10: 00000300     0 SECTION LOCAL  DEFAULT   10   
  13. 25.     11: 00000330     0 SECTION LOCAL  DEFAULT   11   
  14. 26.     12: 00000468     0 SECTION LOCAL  DEFAULT   12   
  15. 27.     13: 00000482     0 SECTION LOCAL  DEFAULT   13   
  16. 28.     14: 000004ac     0 SECTION LOCAL  DEFAULT   14   
  17. 29.     15: 000004d8     0 SECTION LOCAL  DEFAULT   15   
  18. 30.     16: 00001f0c     0 SECTION LOCAL  DEFAULT   16   
  19. 31.     17: 00001f14     0 SECTION LOCAL  DEFAULT   17   
  20. 32.     18: 00001f1c     0 SECTION LOCAL  DEFAULT   18   
  21. 33.     19: 00001f20     0 SECTION LOCAL  DEFAULT   19   
  22. 34.     20: 00001fe8     0 SECTION LOCAL  DEFAULT   20   
  23. 35.     21: 00001ff4     0 SECTION LOCAL  DEFAULT   21   
  24. 36.     22: 00002008     0 SECTION LOCAL  DEFAULT   22   
  25. 37.     23: 0000200c     0 SECTION LOCAL  DEFAULT   23   
  26. 38.     24: 00000000     0 SECTION LOCAL  DEFAULT   24   
  27. 39.     25: 00000414    20 FUNC    LOCAL  DEFAULT   11 func_3  
  28. 40.     26: 000003ec    20 FUNC    GLOBAL DEFAULT   11 func_1  



显而易见:动态符号表中是函数func_2,func_1,静态符号表中是func_3,func_1

原文地址:https://www.cnblogs.com/ibyte/p/6269123.html