那些年那些事
Static变量
-
更新so后 值不变
- TODO
-
load-load-unload core
- TODO
链接那点事
So搜索路径
-
优先级
-
链接时参数-Wl,-rpath
- ldd *.so时,若存在路径unknown的依赖库,那么该参数在链接时,就是未配置的
- 不存在路径unknown的依赖库,也不意味着链接时就用了这个参数
-
运行时ld_library_path
- 该变量中若存在多个路径时,从左往右,优先级递减
- 系统配置/etc/ld.so.conf
-
-
其他
- RUNPATH
- -rpath-link
运行时加载
-
dlopen参数
-
- 使得库中的解析的定义变量在随后的其它的链接库中变得可以使用
-
RTLOAD_LOCAL
- 语义和RTLD_GLOBAL相反,默认行为,工程开发中,更为稳妥些。
-
-
- 当调用该函数后,动态库可能并未从内存中unload。甚至在部分情况下,根本不会unload
- Although dlclose operation is not required to remove structures from an address space, neither is an implementation prohibited from doing so. The only restriction on such a removal is that no object shall be removed to which references have been relocated, until or unless all such references are removed. 翻译一下就是,dlclose没有要求实际unload,也没要求不unload。如果以RTLD_GLOBAL的方式dlopen动态库,且该动态库的变量被进程其他模块引用,那么除非这些引用全部失效,才可以unload动态库。
QA
Q: 一个so load-unload-load时发生了啥
A: unload可能并未生效,因为load-unload-load的行为等价于load的行为,静态变量可能并未初始化两次
Q: 拷贝一个so到另外的路径,依次load后,dlopen后,拿到的是一个handler吗
A:不是,是两个handler。静态变量会初始化两次
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。