版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
共享库版本
readelf -d 是dump .dynamic字段的意思
- readelf -x=< number | name >
可以指定dump相应的.name的section
gcc -L -l 链接名
ref @ https://www.cnblogs.com/benio/archive/2010/10/25/1860394.html
-
如果要链接libm.so.2.1.6( 数学库 )
- 直接 gcc xx.c -lm [ 前提是 math必须在/lib /usr/lib /usr/local/lib三个路径下 ]
- 如果不在上述三个目录是找不到的 所以用-L参数指定目录 ,紧跟在L之后即可
- gcc xx.c -L/aaa/bbb/ccc -ltest ( libtest.so在/aaa/bbb/ccc这个目录下 )
-
自动生成链接参数
- xxxx-config,一般放在/usr/bin
-
-l参数默认是寻找动态共享库(.so),找不到的情况下找静态库(.a)
- 如果想要强制使用静态链接 , 就要加上-static参数,这样一来就会把所有的库都变成了静态链接(想要混着来也可以 还要加一些配置)
8.2 符号版本
用到再看吧
8.3 共享库系统路径
三个路径
8.4 共享库查找过程
- /etc/ld.so.conf
- ldconfig
- 会更新共享库的SO-NAME
- 会生成一个/etc/ld.so.cache的SO-NAME缓存
如果为了编译某个东西临时安装了某个库 记得ldconfig,不然gcc可能还是找不到这个库(虽然你已经安装在了/usr/lib之类的路径里面
问题来了。。所以gcc找库的时候到底是根据gcc的prefix还是根据ld.so.conf啊?还是都有啊??
- 环境变量 LD_LIBRARY_PATH
- 临时改变某个应用程序的链接搜索路径 且不影响其他程序
- 相当于gcc的-L参数
- 不应该滥用,更不应该export,很容易影响到别的进程
- 两种修改方式
- 环境变量 LD_PRELOAD
- /etc/ld.preload
- 会覆盖后面装载进来的同名函数 – 用于调试很方便
-
环境变量 LD_DEBUG
-
用于调试链接过程非常有用
-
LD_DEBUG=files / all / help / versions / reloc等等等等
-
gcc命令其实是多个命令的合集 里面includes ld命令,我们可以使用-W1,-rpath,值(或者-soname,值) 之类的形式,这样gcc命令在被拆解到ld命令那一步的时候就会带上这些参数
-
ldconfig -n 在当前文件夹下创建软链接,后面编译链接的时候还得加个-L路径参数指向这个文件夹
question
- task : 试试创建一个.so文件 然后创建相应的软链接,然后使用-rpath之类的进行链接然后运行看看