Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux dlopen不';你不尊重本地人吗?_Linux_Shared Libraries_Glibc_Dlopen - Fatal编程技术网

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
    版本
  • 由于步骤2失败,您的
    dlopen
    被拒绝
  • 请注意,您永远无法从
    libstdc++.so.6
    解析任何符号(其中
    RTLD\u LOCAL
    很重要);你早就失败了


    现在,您可能正在尝试构建
    A.so
    ,使其可以动态加载到任意程序中,可能是使用较旧版本的
    libstdc++.so.6
    ,而不强制最终用户更新系统
    libstdc++.so.6
    。不幸的是,这根本无法做到。

    关于您的最后一段,为什么dlmopen()不能做到这一点?显然,您无法在接口之间传递STL类型(即在使用libstdc++.so的不同实例的代码之间),但它在库中不适合私人使用吗?