第八章 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) (共享库组合)