【问题标题】:"dynamically linked at run time but statically aware" - how to control which .so file loaded?“在运行时动态链接但静态感知” - 如何控制加载的 .so 文件?
【发布时间】:2016-10-21 15:55:12
【问题描述】:

参考this answer

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

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

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

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

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

这是否像 Windows manifest files 那样允许应用程序加载到特定的 dll 中?

控制 .so 加载的机制是什么?
必须有这样的机制,否则“已编译”的 .so 是唯一允许加载的机制,这违背了使其动态的目的?

【问题讨论】:

  • 在 Windows 中,一个可能更容易理解的等价物是 import library,它是从模块定义文件或 dll 生成的,并链接到任何想要拉入模块的模块问题。
  • @WhozCraig 你能推荐一个网站,用图表解释 Linux 应用程序如何加载和使用 .so 文件吗?

标签: c++ linux gcc


【解决方案1】:

这意味着库在链接时可用,因此链接器可以验证您从.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

【讨论】:

    猜你喜欢
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2016-06-02
    • 2014-02-14
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    相关资源
    最近更新 更多