前言
主要介绍一些基础知识和自己学习过程中的几个误区,如果有错漏的地方,烦请指正,一起学习!
所有知识点均基于红帽系统验证过
目录
动态库编译
动态库加载
动态库配置和预加载
动态库查询
动态库统一部署
dlopen的优缺点
动态库的命名和版本控制
正文
1. 动态库的编译
a) 生成动态链接库的命令很简单:
#gcc -shared -fPIC -Wl,-soname,libmosquitto.so.1 mosquitto.o ... -o libmosquitto.so.1 -Wl,--as-needed -lrt -lssl -lcrypto -lpthread
#gcc sub_client.o -o mosquitto_sub -L../lib ../lib/libmosquitto.so.1 -Wl,-rpath,'$ORIGIN'/lib -Wl,-rpath-link,
b) "-Wl,soname,${name}", 使用这个参数可能把这个“别名”写到目标文件的ELF头信息中,
b) "-Wl,--as-needed", 在动态库前面使用这个参数,可以在自动剔除目标文件没有真正使用的库;但是在使用中要注意GCC/G++对目标文件、链接库的顺序问题,以免不当使用引起undefined referenced的错误;
c) "-Wl, -rpath,${lib-relative-path}", 使用这个参数,添加一个私有的库搜索路径,而不会影响到系统级别的库配置信息(详见动态库搜索路径部分);多个目录之间使用冒号":"硬编码到可执行文件内部; '$ORIGING ',代表程序目录,需要加单引号,否则会被解释为变量ORIGIN的值。这样gcc的链接flags为 “-Wl,-rpath,'$ORIGING'/lib ”
d) "-Wl1,-rpath-link,${dir}", 用于链接阶段,如果指定了一个库A,但是库A依赖库B&#x