ctype 加载的共享库符号也在 glibc 中定义;如何选择符号?

ctype loaded shared library symbol also defined in glibc; how to choose symbol?

使用python ctypes;加载的共享库 (A) 定义了一个 sem_init 函数,该函数由后续加载的共享库 (B) 调用,该共享库链接到库 A。执行(在 gdb 中)导致分段错误,看起来像这样库 B 从 /lib/libpthread.so.0(glibc 的一部分?)调用 sem_init@@GLIBC_2.4,而不是库 A 提供的 sem_init

为了确认,我在库 A 和 B 中重命名了 sem_init,问题就消失了。不幸的是,其他程序依赖于库 A 中的符号 sem_init,因此这不是解决方案。如何确保库 B 从库 A 调用 sem_init 而不对库 A 进行任何更改?

Unfortunately, other programs depend on the symbol sem_init in library A so this cannot be a solution.

libBsem_init 的引用解析为 libpthread.so.0 内的定义(GLIBC 的一部分),因为 libpthread.so.0 作为主 [=] 的依赖项加载15=] 二进制,因此在符号搜索列表中出现 before libA。所以每个 "normal" 对 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(...);

这可行 IF sem_init 是唯一的冲突符号,但如果存在其他符号冲突,则可能会以不明显的方式中断。