• 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

  • 相关阅读:
    SparkStreaming整合Flume的pull方式之启动报错解决方案
    n-map安装实操
    性能测试从入门到入土的一点思考
    基于Influxdb对InfluxDBResultMapper的一点扩展
    数据库恢复技术
    (转引)数据库索引(MySQL)
    携程一面凉经
    一文总结机器学习常见模型
    深度学习实战
    DFS
  • 原文地址:https://www.cnblogs.com/ibyte/p/6269123.html
Copyright © 2020-2023  润新知