Linux dlopen不';你不尊重本地人吗?
我有Linux dlopen不';你不尊重本地人吗?,linux,shared-libraries,glibc,dlopen,Linux,Shared Libraries,Glibc,Dlopen,我有A.so,它在自己的目录中链接到一个特定版本的libstdc++.so.6(通过rpath设置为$ORIGIN) 如果我单独打开A.so,它就可以正常工作 如果我dlopen我的系统的libstdc++.so.6(不同版本)处于RTLD_LOCAL模式,然后dlopenA.so OSError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by A.so) 为什
A.so
,它在自己的目录中链接到一个特定版本的libstdc++.so.6
(通过rpath
设置为$ORIGIN
)
如果我单独打开A.so,它就可以正常工作
如果我dlopen
我的系统的libstdc++.so.6
(不同版本)处于RTLD_LOCAL
模式,然后dlopen
A.so
OSError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by A.so)
为什么dlopen不尊重本地的RTLD\u
为什么dlopen不尊重本地的RTLD\u
RTLD_LOCAL
并不是你认为的意思。从man dlopen
:
RTLD_LOCAL
This is the converse of RTLD_GLOBAL, and the default if
neither flag is specified. Symbols defined in this shared
object are not made available to resolve references in
subsequently loaded shared objects.
请注意,这并没有说明加载程序正在加载哪个库
加载程序永远不会加载给定的SONAME
的多个实例(除非您使用dlmopen
使用不同的链接器作用域),因此当您dlopen
系统libstdc++.so.6
时,这是唯一的libstdc++.so.6
。当您稍后dlopen(“A.so”,…)
时,运行时加载程序:
A.so
依赖的库,发现libstdc++.so.6
就在其中,并发现它已经加载了libstdc++.so.6
,因此它既不搜索也不加载其他副本A.so
需要的版本符号。正是在这一点上,您得到了错误,因为A.so
需要GLIBCXX_3.4.20
来自libsstdc++.so.6
,并且因为已经加载的系统libstdc++.so.6
较旧,并且不提供GLIBCXX_3.4.20
版本dlopen
被拒绝libstdc++.so.6
解析任何符号(其中RTLD\u LOCAL
很重要);你早就失败了
现在,您可能正在尝试构建
A.so
,使其可以动态加载到任意程序中,可能是使用较旧版本的libstdc++.so.6
,而不强制最终用户更新系统libstdc++.so.6
。不幸的是,这根本无法做到。关于您的最后一段,为什么dlmopen()不能做到这一点?显然,您无法在接口之间传递STL类型(即在使用libstdc++.so的不同实例的代码之间),但它在库中不适合私人使用吗?