程序员的自我修养 chapeter 8 Linux共享库的组织

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Hesy_H/article/details/101119696

共享库版本

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之类的进行链接然后运行看看

猜你喜欢

转载自blog.csdn.net/Hesy_H/article/details/101119696