动态库和静态库的依赖问题
# 动态库符号表依赖不会向前递归查找(不一定)
最开始的现象: 如果主程序依赖a.so, a.so依赖b.so,此时主程序导出了符号s, a中用到了符号s,b中也用到了符号s,如果在编译主程序时并未链接到b(只在编译a.so时链接到b),那么运行时b.so会报错找不到符号s。
由此可以推断:
- 当ld加载a.so时,它所需的符号会从主程序中查找;
- 当ld加载b.so时,它所需的符号会从a.so中查找,但是不会再向上一层从主程序中查找,
后来发现好像又可以了。
# 主程序导出的符号默认会按需导出
当主程序在编译时链接到一些动态库时,其默认情况下只会导出动态库所需的符号;
主程序导出的符号并不能被LD_PRELOAD hook;
gcc编译时指定--export-dynamic
选项,可以导出全部符号。
# 动态库依赖静态库时,要将静态库放在gcc编译命令行的后面
参考: https://blog.csdn.net/qingzhuyuxian/article/details/124409590 (opens new window)
假设现在有一个静态库libsss.a, 我们要编译一个libddd.so,它依赖了这个静态库
# 如果把-lsss放在ddd.c前面,那编译出来的libddd.so将不会包含静态库中的符号,运行时会报符号错误。
gcc -o libddd.so -shared -fPIC -L. -lsss ddd.c
# 如果把-lsss放在ddd.c后面,那编译出来的libddd.so将会包含静态库中的符号
gcc -o libddd.so -shared -fPIC -L. ddd.c -lsss
1
2
3
4
5
2
3
4
5
编辑 (opens new window)
上次更新: 2023/05/07, 17:29:19