那些年动态库加载碰到的事er

服务器

浏览数:119

2020-6-24

那些年那些事

Static变量

  • 更新so后 值不变

    • TODO
  • load-load-unload core

    • TODO

链接那点事

So搜索路径

  • 优先级

    1. 链接时参数-Wl,-rpath

      • ldd *.so时,若存在路径unknown的依赖库,那么该参数在链接时,就是未配置的
      • 不存在路径unknown的依赖库,也不意味着链接时就用了这个参数
    2. 运行时ld_library_path

      • 该变量中若存在多个路径时,从左往右,优先级递减
    3. 系统配置/etc/ld.so.conf
  • 其他

    • RUNPATH
    • -rpath-link

运行时加载

  • dlopen参数

    • RTLD_GLOBAL

      • 使得库中的解析的定义变量在随后的其它的链接库中变得可以使用
    • RTLOAD_LOCAL

      • 语义和RTLD_GLOBAL相反,默认行为,工程开发中,更为稳妥些。
  • dlclose

    • 当调用该函数后,动态库可能并未从内存中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。静态变量会初始化两次

作者:shiyang6017