现在我有 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
我希望结果是“COME HERE B”,我可以使用带有 RTLD_DEEPBIND
标志的 dlopen
,
但是在我的项目中将函数从隐式调用更改为显式调用花费了太多时间。
无论如何要解决这个问题?
gcc -Wl,-Bsymbolic
在此解决方案中不起作用。
好吧,如果 A.c 包含 common 的实现。它确实有效。
最佳答案
看起来当动态链接器在运行时搜索一个符号时,它会选择它遇到的第一个。搜索顺序取决于二进制文件 DT_NEEDED
部分中库的顺序,而这又取决于编译期间命令行中库的确切顺序。
因此,编译test.c
时,确保libB.so
在命令行的libC.so
之前。
关于c - 隐式调用时如何使用RTLD_DEEPBIND?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13342295/