首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ctype加载的共享库符号也在glibc中定义;如何选择符号?

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

Stack Overflow用户
提问于 2018-06-22 01:15:27
回答 1查看 105关注 0票数 1

使用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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-25 00:56:32

不幸的是,其他程序依赖于库A中的符号sem_init,所以这不是一个解决方案。

libBsem_init的引用解析为libpthread.so.0 (GLIBC的一部分)中的定义,因为libpthread.so.0是作为主python二进制文件的依赖项加载的,因此在符号搜索列表中出现在libA之前。因此,对sem_init的每个“正常”引用都将解析为libpthread的定义。这就像预期的那样工作(覆盖标准库提供的符号是一个非常糟糕的想法(TM) )。

您可以强制libB.so使用libA.so:sem_init,方法是在libB中执行以下操作(省略错误检查):

代码语言:javascript
复制
void *h = dlopen("libA.so", RTLD_NOW|RTLD_GLOBAL)
void (*p_sem_init)(...) = dlsym(h, "sem_init");

// Call it:
p_sem_init(...);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50974207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档