C 隐式调用时如何使用RTLD_DEEPBIND?
现在我有3个共享对象,A.so,B.so,C.soC 隐式调用时如何使用RTLD_DEEPBIND?,c,linux,shared-objects,dlopen,shared-libraries,C,Linux,Shared Objects,Dlopen,Shared Libraries,现在我有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");
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
我希望结果是“来这里B”,我可以使用dlopen
和RTLD\u DEEPBIND
标志,但在我的项目中,将函数从隐式调用更改为显式调用需要花费太多时间。
有没有办法解决这个问题
gcc-Wl,-Bsymbolic
在此解决方案中不起作用
好吧,如果A.c包含公共的实现。它确实有效 看起来,当动态链接器在运行时搜索符号时,它会选择遇到的第一个符号。搜索顺序取决于二进制文件
DT_NEEDED
部分中库的顺序,而这又取决于编译期间命令行中库的确切顺序。
因此,在编译test.c
时,确保命令行上libB.So
在libC.So
之前