【问题标题】:How to use RTLD_DEEPBIND when invoke implicitly?隐式调用时如何使用 RTLD_DEEPBIND?
【发布时间】:2012-10-31 19:01:52
【问题描述】:

现在我有 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”,我可以使用 dlopenRTLD_DEEPBIND 标志,
但是在我的项目中将函数从隐式调用更改为显式调用会花费太多时间。
有没有办法解决这个问题?

gcc -Wl,-Bsymbolic 在此解决方案中不起作用。

好吧,如果 A.c 包含 common 的实现。它确实有效。

【问题讨论】:

    标签: c linux shared-objects dlopen shared-libraries


    【解决方案1】:

    看起来当动态链接器在运行时搜索一个符号时,它会选择它遇到的第一个。搜索顺序取决于二进制文件DT_NEEDED 部分中库的顺序,而这又取决于编译期间命令行中库的确切顺序。 因此,在编译test.c 时,请确保libB.so 在命令行上位于libC.so 之前。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      相关资源
      最近更新 更多