linux - Linux 共享库依赖于 dlopen 使用 RTLD_LOCAL 打开的另一个共享库中的符号
问题描述
我有一个共享库libmain.so
,由主机程序加载dlopen("libmain.so", RTLD_LOCAL)
,在某些情况下,libmain.so
将加载另一个共享库,libpatch.so
也加载dlopen
。问题是,libpatch.so 依赖于 libmain.so 中的符号,那么我该如何解决呢?
由于许可原因,不能更改
RTLD_LOCAL
为。RTLD_GLOBAL
有一个问题和这个问题很相似,解决这个问题的方法是做
libpatch.so
一个依赖libmain.so
,所以加载的时候libmain.so
会加载,但是我的libpatch.so
应该有条件加载,链接的libpatch.so
时候可能不存在libmain.so
。
编辑:我要解决的原始问题是:
在进程运行的时候,我们可能会发现里面的函数有bug SomeFunction
,libmain.so
但是进程不能重启,libmain.so
也不能重新加载,所以我们必须提供一个libpatch.so
with bug-fixed function SomeFunction
,给进程发送信号,make它加载libpatch.so
,并使用SomeFunction
在libpatch.so
而不是越野车之一libmain.so
。但是,SomeFunction
依赖于一个全局变量GlobalVar
,它可能在 里面发生了变化libmain.so
,所以我们想在SomeFunction
里面链接到它libmain.so
,但是libmain.so
被加载了RTLD_LOCAL
,在加载的GlobalVar
时候不能被引用libpatch.so
。
解决方案
编译 libpatch.so 所需的来自 libmain.so 的符号列表。构建一个包含这些符号地址的数据结构。构建 libpatch.so 不是针对 libmain.so,而是针对此数据结构。将它的一个实例传递给 libpatch.so 初始化函数。
推荐阅读
- c++ - D2D1 初始化映像工厂失败
- html - 无法在 Angular 9 上使用 ngmodel 设置默认选择属性
- python - 如何在python中的关键字之后从字符串中提取浮点数
- python - 统计消息的反应并在有一定数量的反应后执行操作
- sql - 仅当相同值的列不存在时,Postgres 才更新列
- c - 笛卡尔坐标系和二维数组
- c# - 只有在 Visual Studio 中进行调试时,手动激活 WPF 窗口才能正常工作
- php - 通过 php 中的标题值获取 HTML 元素
- python - 在 Django 中使用 FontAwesome5
- laravel - 在单选按钮或复选框列表上处理“其他”的最佳方法是什么