我有 2 个应用程序,比如 A1,A2 共享一个共享对象(比如 lib1),该对象在运行时加载到应用程序中。 A1 使用 dlopen 成功加载 lib1。现在A2想要加载库。 A2可以吗?(因为lib1加载在A1地址空间中)。如果 A1 使用 RTLD_LOCAL 加载会怎样? A2可以加载lib吗?
答案1
是的当然。来自维基百科关于图书馆的文章:
共享库或共享对象是旨在由可执行文件和其他共享对象文件共享的文件
换句话说,它们被称为“共享”的全部原因是因为有多个可执行文件正在使用它们。
从文档中RTLD_LOCAL
:
此库中定义的符号不可用于解析后续加载的库中的引用。
标志RTLD_LOCAL
todlopen()
只是表明,当A1
加载时lib1
,如果它定义了一个函数f1()
,然后A1
加载lib2
,它就不能使用f1()
from lib1
,因为它是本地加载的。