我有一个共享库libmain.so
,由主机程序使用dlopen("libmain.so", RTLD_LOCAL)
加载,并且在某些情况下,libmain.so
将加载另一个共享库libpatch.so
,并使用dlopen
。问题是, libpatch.so取决于libmain.so中的符号,那么我该如何解决呢?
由于权限原因,无法将RTLD_LOCAL
更改为RTLD_GLOBAL
。
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
。
答案 0 :(得分:1)
从libmain.so编译libpatch.so所需的符号列表。建立一个包含这些符号地址的数据结构。不针对libmain.so而是针对此数据结构构建libpatch.so。将其实例传递给libpatch.so初始化函数。
答案 1 :(得分:0)
有两种方法:
详细参考: https://docs.oracle.com/cd/E19120-01/open.solaris/819-0690/chapter3-14/index.html