使用python ctype;加载的共享库( A )定义了一个sem_init
函数,该函数由链接到库A的后续加载的共享库(B)调用。执行(在gdb中)会导致分段错误,看起来像是库B从/lib/libpthread.so.0
( glibc?)调用sem_init@@GLIBC_2.4
。而不是库A提供的sem_init
。
为了确认,我将库A和库B中的sem_init
重命名,这样问题就解决了。不幸的是,其他程序依赖于库A中的符号sem_init
,所以这不是一个解决方案。如何确保库B在不对库A进行任何更改的情况下从库A调用sem_init
?
发布于 2018-06-25 00:56:32
不幸的是,其他程序依赖于库A中的符号sem_init,所以这不是一个解决方案。
从libB
到sem_init
的引用解析为libpthread.so.0
(GLIBC的一部分)中的定义,因为libpthread.so.0
是作为主python
二进制文件的依赖项加载的,因此在符号搜索列表中出现在libA
之前。因此,对sem_init
的每个“正常”引用都将解析为libpthread
的定义。这就像预期的那样工作(覆盖标准库提供的符号是一个非常糟糕的想法(TM) )。
您可以强制libB.so
使用libA.so:sem_init
,方法是在libB
中执行以下操作(省略错误检查):
void *h = dlopen("libA.so", RTLD_NOW|RTLD_GLOBAL)
void (*p_sem_init)(...) = dlsym(h, "sem_init");
// Call it:
p_sem_init(...);
如果sem_init
是唯一冲突的符号,这将起作用,但如果存在其他符号冲突,则可能以不明显的方式中断。
https://stackoverflow.com/questions/50974207
复制相似问题