编译符号表导出示例:

使用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. void func_1()
  4. {
  5. printf("a1 :: func_1\n");
  6. }
  7. void func_2()

10. {

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

12. }

  1. 13.

14. void func_3()

15. {

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

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

C 符号表导出的更多相关文章

  1. C/C++编译和链接过程详解 (重定向表,导出符号表,未解决符号表)

    详解link  有 些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错 ...

  2. (转载) C/C++编译和链接过程详解 (重定向表,导出符号表,未解决符号表)

    转载http://blog.csdn.net/neo_ustc/article/details/9024839 有 些人写C/C++(以下假定为C++)程序,对unresolved external ...

  3. GCC制作动态库导出符号表【转】

    转自:https://blog.csdn.net/whb_fei/article/details/76974543 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...

  4. ELF Format 笔记(七)—— 符号表

    最是那一低头的温柔,像一朵水莲花不胜凉风的娇羞,道一声珍重,道一声珍重,那一声珍重里有蜜甜的忧愁 —— 徐志摩 ilocker:关注 Android 安全(新手) QQ: 2597294287 符号表 ...

  5. 使用objdump objcopy查看与修改符号表

    使用objdump objcopy查看与修改符号表动态库Linuxgccfunction    我们在 Linux 下运行一个程序,有时会无法启动,报缺少某某库.这时需要查看可执行程序或者动态库中的符 ...

  6. ELF 动态链接 so的动态符号表(.dynsym)

    静态链接中有一个专门的段叫符号表 -- ".symtab"(Symbol Table), 里面保存了所有关于该目标文件的符号的定义和引用. 动态链接中同样有一个段叫 动态符号表 - ...

  7. 转: iOS崩溃堆栈符号表使用与用途

    转:http://bugly.qq.com/blog/?p=119 iOS崩溃堆栈符号化,定位问题分分钟搞定! 2015.3.16 腾讯Bugly 微信分享   最近一段时间,在跟开发者沟通过程中,萝 ...

  8. Linux设备驱动程序 之 内核符号表

    insmod使用公共内核符号表来解析模块中未定义的符号.功能内核符号表中包含了所有全局内核项(函数和变量)的地址,这是实现模块化驱动程序所必须的.当模块装载到内核后,它所导出的任何符号都会变成内核符号 ...

  9. 数据库多张表导出到excel

    数据库多张表导出到excel public static void export() throws Exception{ //声明需要导出的数据库 String dbName = "hdcl ...

随机推荐

  1. jstree -- 使用JSON 数据组装成树

    概述: 前面主要是html数据,这里主要是json数组 1.格式 jsTree需要一个具体格式JSON数据,在标准的语法没有那个字段是必须的-而是那些是你需要的.请记住你可以获取任何你请求的其他属性, ...

  2. spring aop 内部调用问题解决

    方法1: 基于 proxy 的 spring aop 带来的内部调用问题可以使用 AopContext.currentProxy() 强转为当前的再调用就可以解决了 例如: 错误用法:public A ...

  3. 出现For input string: "" 错误

    然后是因为后台生成的是一个数组,前台取的是一个对象,所以会产生这个错误 前后台交互时 mv.addObject("vo1",fhList.get(0));}将数组改成fhList. ...

  4. Leetcode747至少是其他数字两倍的最大数

    Leetcode747至少是其他数字两倍的最大数 在一个给定的数组nums中,总是存在一个最大元素 .查找数组中的最大元素是否至少是数组中每个其他数字的两倍.如果是,则返回最大元素的索引,否则返回-1 ...

  5. java8 foreach不能使用break、countinue

    在学习1.8新特性的过程中,发现foreach中不可以使用break和countinue,然后我使用了return,结果如下图,对循环并没有影响. 百度一下,发现了一个不一样的回答 然后我就看了下源码 ...

  6. java string与byte互转

    1.string 转 byte[]byte[] midbytes=isoString.getBytes("UTF8");//为UTF8编码byte[] isoret = srt2. ...

  7. css--小白入门篇4

    一.前文回顾 盒模型box model 什么是盒子?所有的标签都是盒子.无论是div.span.a都是盒子.图片.表单元素一律看做文本. 盒模型有哪些组成:width.height.padding.b ...

  8. python3中post请求里带list报错

    这个post请求的数据太长,一般data=,json=就够了. 但是今天这个一直报错,用json吧,报缺少参数,用data吧,报多余[. 后来改成data=,并把数据中的[] 用引号括起来," ...

  9. 百练4103:踩方格(DFS)

    描述 有一个方格矩阵,矩阵边界在无穷远处.我们做如下假设:a.    每走一步时,只能从当前方格移动一格,走到某个相邻的方格上:b.    走过的格子立即塌陷无法再走第二次:c.    只能向北.东. ...

  10. vue axios请求超时,设置重新请求的完美解决方法

    //在main.js设置全局的请求次数,请求的间隙 axios.defaults.retry = 4; axios.defaults.retryDelay = 1000; axios.intercep ...