[读书笔记]程序员的自我修养(8)

第八章 Linux共享库的组织

1. 共享库系统路径
/lib:主要存放系统最关键和基础的共享库,比如动态链接库、C语言运行库、数学库等,这些库主要是那些/bin和/sbin下程序所需要用到的库,还有系统启动时需要的库。
/usr/lib:非系统运行时关键性共享库,主要是开发用到的库,一般不会被用户的程序和shell脚本直接用到,还可能包含开发时用到的静态库、目标文件等。
/usr/local/lib:第三方应用程序库。

ldconfig程序,/etc/ld.so.conf

2. 环境变量:why LD_LIBRARY_PATH is bad讨论了为什么不要随意使用该环境变量,请google。

3. 共享库的创建和安装
创建:
用如下命令来生成一个共享库:
$gcc -shared -Wl,-soname,mysoname -o library_name source_files library_files
如果我们不使用-soname来指定共享库的SO-NAME,那么该共享库默认就没有SO-NAME,即使使用ldconfig更新SO-NAME的软链接时,对该共享库也没有效果。
不要使用gcc的“-fomit-frame-pointer”
测试新共享库,不影响现有程序的正常运行,使用LD_LIBRARY_PATH配置,或者适应链接器-rpath选项或者gcc的-Wl,-rpath比如:
$ld -rpath /home/mylib -o program.out program.o -lsomelib
注意使用ld的"-export-dynamic"参数或者gcc的"-Wl,-export-dynamic"

最终发布版本清除符号信息:$strip libfoo.so,此外gcc -Wl,-s(清除所有符号信息),-Wl,-S(消除调试符号信息)

安装:
$ldconfig -n shared_library_directory    指定共享库所在目录
共享库构造函数 __attribute__((constructor(num)))
析构函数__attribute__((destructor(num)))      注:num是优先级

如果我们使用了这种析构或者构造函数(在系统默认的标准运行库或者情动文件里运行),那么必须使用系统默认的标准运行库和启动文件,即不可以使用gcc的"-nostartfiles"或“nostdlib”参数

共享库脚本:GROUP(/lib/libc.so.6 /lib/libm.so.2)  (共享库组合)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值