"在运行时动态链接但静态感知" - 如何控制加载哪个.so文件?

时间:2016-10-21 15:55:13

标签: c++ linux gcc

参考this answer

  

有两种Linux C / C ++库类型。

     
      
  • 静态库(*.a)是目标代码的归档,它们与应用程序链接并成为其中的一部分。他们被创造了   使用ar(1)命令可以操作,并且ar -t libfoo.a将列出库/存档中的文件。

  •   
  • 动态链接的共享对象库(*.so)可以通过两种方式使用。

         
        
    1. 共享对象库可以在运行时动态链接,但可以静态识别。这些库必须在期间可用   编译/链接阶段。共享对象不包含在   二进制可执行文件但与执行有关。
    2.   
    3. 可以使用动态链接加载器系统在执行期间动态加载/卸载和链接共享对象库   功能。
    4.   
  •   

制作动态 lib tied to the execution是什么意思?

是否像Windows manifest files那样允许应用加载特定的 dll

控制 .so 加载的机制是什么?
必须有这样一种机制,否则"编译" .so 是唯一一个允许加载的内容,这使得动态的目的失败了?

1 个答案:

答案 0 :(得分:0)

这意味着该库在链接时可用,因此链接器可以验证您.so中引用的函数是否存在于.so中。优点是对这些函数的调用是透明的。换句话说,如果您使用

链接到.so
int foo(double bar);

你这样称呼它

int res = foo(4.2);

链接器确保foo存在,并且它需要一个double类型的参数。在那之后它"链接"调用网站int res = ...到该函数。

在执行期间动态加载/卸载使您可以在构建系统上没有.so的情况下进行链接(因此,没有"静态感知")。为了增加灵活性,您可以打开系统,直到找不到目标.so中所需的功能。您的通话顺序看起来也比foo(4.2)要复杂得多,因为您需要完成dlopen准备步骤。有关.so中呼叫功能的更多信息位于this Q&A