son*_*990 5 c linux shared-libraries shared-objects dlopen
现在我有3个共享对象,A.so,B.so,C.so
A.c
void libA()
{
common();
}
B.c
void common()
{
printf("COME HERE B\n");
}
C.c
void common()
{
printf("COME HERE C\n");
}
(just ingore the .h files)
test.c
int main()
{
libA();
return 1;
}
complie:
gcc -fPIC -shared libB.so libB.c
gcc -fPIC -shared libA.so libA.c ./libB.so
gcc -o test test.c libC.so libA.so
Run Code Online (Sandbox Code Playgroud)
我希望结果是"来这里B",我可以用dlopen用RTLD_DEEPBIND标志,
但它的成本太多时间从隐式调用函数改变成显式调用在我的项目.
反正有没有解决这个问题?
gcc -Wl,-Bsymbolic 在此解决方案中不起作用.
好吧,如果Ac包含普通的实现.它确实有效.
小智 1
看起来,当动态链接器在运行时搜索符号时,它会选择遇到的第一个符号。搜索顺序取决于DT_NEEDED二进制文件部分中库的顺序,而这又取决于编译期间命令行中库的确切顺序。因此,编译时请确保命令行上libB.so有 before 。libC.sotest.c