c - 隐式调用时如何使用RTLD_DEEPBIND?

标签 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");  
    }  
    (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/

相关文章:

java - 在 Red5 中存储和检索共享对象

c - 读取和更改 C uint32_t 中的位

linux - CentOS 6.9 yum 和 yum 更新都不起作用

linux - Linux/ncurses 自动化测试工具

c++ - 动态链接 : is it possible to disable automatic loading of non used shared objects?

c++ - 链接器如何知道应该在运行时解析哪些符号?

c - 监控服务器的线程性能

c - 从宏的内容定义宏

c - BOOLEAN allocate_items(struct item * items, size_t howmany) 函数用于分配 struct item 数组

linux - 挂载/卸载 USB 笔式驱动器后运行命令