dlopen后续调用作用域规则咨询及符号可用性疑问
dlopen作用域相关问题解答
1. dlopen后续调用的作用域规则
- 用
RTLD_LOCAL参数加载的共享对象,其符号仅对自身以及依赖它的直接/间接加载对象可见,不会进入全局符号表,其他无关的加载对象或主程序无法直接访问这些符号(除非通过dlsym显式获取)。 - 用
RTLD_GLOBAL参数加载的共享对象,其符号会被加入全局符号表,后续所有通过dlopen加载的共享对象(无论用RTLD_LOCAL还是RTLD_GLOBAL)在解析未定义符号时,都可以直接使用这些全局符号。 - 如果后续dlopen同时指定
RTLD_GLOBAL和RTLD_LOCAL,RTLD_GLOBAL优先级更高。 - 主可执行文件的符号默认是全局的,所有加载的共享对象都能直接引用。
2. 嵌套dlopen场景的符号可见性问题
场景说明
可执行文件通过RTLD_LOCAL加载libfirst.so,libfirst.so又通过RTLD_GLOBAL加载libsecond.so。
结论与理解验证
- 无需
dlsym的情况下,libsecond.so的符号既不能在libfirst.so中直接使用,也不能在主可执行文件中直接使用,必须通过dlsym显式获取。 - 你的理解是正确的:
RTLD_GLOBAL的核心作用是让当前加载的共享对象符号,供后续加载的共享对象做符号解析时使用,而非对加载它的父对象(libfirst.so)或主程序开放直接访问权限。
内容的提问来源于stack exchange,提问作者mallwright
相关产品推荐
相关产品推荐

