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.
从 libB
到 sem_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
是唯一的冲突符号,但如果存在其他符号冲突,则可能会以不明显的方式中断。
使用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.
从 libB
到 sem_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
是唯一的冲突符号,但如果存在其他符号冲突,则可能会以不明显的方式中断。