linux – dlopen不尊重`RTLD_LOCAL`?

linux – dlopen不尊重`RTLD_LOCAL`?,第1张

概述我有A.so,它在自己的目录下链接到特定版本的libstdc .so.6(通过设置为$ORIGIN的rpath). 如果我独自完成A.so,它运作正常. 如果我在RTLD_LOCAL模式下运行我的系统的libstdc .so.6(它的版本不同),然后dlopen A.so OSError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLI 我有A.so,它在自己的目录下链接到特定版本的libstdc .so.6(通过设置为$ORIGIN的rpath).

如果我独自完成A.so,它运作正常.

如果我在RTLD_LOCAL模式下运行我的系统的libstdc .so.6(它的版本不同),然后dlopen A.so

OSError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GliBCXX_3.4.20' not found (required by A.so)

为什么不尊重RTLD_LOCAL?

解决方法

Why doesn’t dlopen respect RTLD_LOCAL

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使用不同的链接器作用域),所以当你运行系统libstdc .so.6时,这是你将得到的唯一的libstdc .so.6.当你以后dlopen(“A.so”,…)时,运行时加载器:

>查找A.so所依赖的库,发现libstdc .so.6就在其中,并发现它已经加载了libstdc .so.6,因此它不会搜索,也不会加载另一个副本,
>查找A.so要求的版本符号.此时您得到错误,因为A.so需要来自libsstdc .so.6的GliBCXX_3.4.20,并且因为已加载的系统libstdc .so.6较旧并且不提供GliBCXX_3.4.20版本.
>由于步骤#2失败,您的dlopen被拒绝.

请注意,您永远无法解析libstdc .so.6中的任何符号(其中RTLD_LOCAL很重要);你早就失败了.

现在,您可能要做的是以这样的方式构建A.so,使其可以动态加载到任意程序中,可能使用较旧版本的libstdc .so.6,而不必强制最终用户更新system libstdc .so.6.不幸的是,这根本无法做到.

总结

以上是内存溢出为你收集整理的linux – dlopen不尊重`RTLD_LOCAL`?全部内容,希望文章能够帮你解决linux – dlopen不尊重`RTLD_LOCAL`?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1021216.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存