Linux共享库取决于dlopen使用RTLD_LOCAL

时间:2019-05-30 07:10:33

标签: linux shared-libraries dlopen

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

  1. 由于权限原因,无法将RTLD_LOCAL更改为RTLD_GLOBAL

  2. There是一个与此问题非常相似的问题,该问题的解决方案是使libpatch.so成为libmain.so的依赖项,因此将在{{ 1}}已加载,但我的libmain.so应该有条件地加载,libpatch.so链接时libpatch.so可能不存在。

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

进程运行时,我们可能会发现libmain.so中的函数SomeFunction中存在错误,但是无法重新启动进程并且无法重新加载libmain.so < / strong>,因此我们必须为libmain.so提供错误修复功能libpatch.so,并向该进程发送信号,使其加载SomeFunction,然后使用{{1} }(libpatch.so中的},而不是SomeFunction中的越野车。但是,libpatch.so依赖于全局变量libmain.so,它可能在SomeFunction中已更改,因此我们想在GlobalVar内将libmain.so链接到它,但是SomeFunction已加载libmain.so,正在加载libmain.so时无法引用RTLD_LOCAL

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

有两种方法:

  1. 使用libmain.so编译libpatch.so
  2. 在libpatch.so中再次打开libmain.so

详细参考: https://docs.oracle.com/cd/E19120-01/open.solaris/819-0690/chapter3-14/index.html