首页 > 解决方案 > Linux 共享库依赖于 dlopen 使用 RTLD_LOCAL 打开的另一个共享库中的符号

问题描述

我有一个共享库libmain.so,由主机程序加载dlopen("libmain.so", RTLD_LOCAL),在某些情况下,libmain.so将加载另一个共享库,libpatch.so也加载dlopen。问题是,libpatch.so 依赖于 libmain.so 中的符号,那么我该如何解决呢?

  1. 由于许可原因,不能更改RTLD_LOCAL为。RTLD_GLOBAL

  2. 一个问题和这个问题很相似,解决这个问题的方法是做libpatch.so一个依赖libmain.so,所以加载的时候libmain.so会加载,但是我的libpatch.so应该有条件加载,链接的libpatch.so时候可能不存在libmain.so

编辑:我要解决的原始问题是:

在进程运行的时候,我们可能会发现里面的函数有bug SomeFunctionlibmain.so但是进程不能重启,libmain.so也不能重新加载,所以我们必须提供一个libpatch.sowith bug-fixed function SomeFunction,给进程发送信号,make它加载libpatch.so,并使用SomeFunctionlibpatch.so而不是越野车之一libmain.so。但是,SomeFunction依赖于一个全局变量GlobalVar,它可能在 里面发生了变化libmain.so,所以我们想在SomeFunction里面链接到它libmain.so,但是libmain.so被加载了RTLD_LOCAL,在加载的GlobalVar时候不能被引用libpatch.so

标签: linuxshared-librariesdlopen

解决方案


编译 libpatch.so 所需的来自 libmain.so 的符号列表。构建一个包含这些符号地址的数据结构。构建 libpatch.so 不是针对 libmain.so,而是针对此数据结构。将它的一个实例传递给 libpatch.so 初始化函数。


推荐阅读