【问题标题】:How the OS find shared library path in two different linking?:run-time linking (loading) and compile time linking shared library in linux操作系统如何在两个不同的链接中找到共享库路径?:Linux中的运行时链接(加载)和编译时链接共享库
【发布时间】:2018-04-16 17:57:18
【问题描述】:

我对共享库和操作系统的工作方式有点困惑。

第一个问题:操作系统如何管理共享库?如何唯一指定它们?通过文件名或其他一些(比如 ID)的东西?还是通过完整路径?!

第二个问题:我知道首先当我们编译和链接代码时,链接器需要访问共享库(.so)来执行链接,然后在我们执行编译程序的这个阶段之后,操作系统会加载共享库,这库可能位于不同的位置(我错了吗?)但我不明白操作系统如何知道在哪里查找共享库,库信息(名称?路径?还是什么?!)编码在可执行文件中?

【问题讨论】:

  • 查看/var/lib目录,你会看到所有libXXX.so.*文件
  • 不,/var/lib 不适用于库,而是用于持久的系统范围数据。

标签: c linux unix operating-system shared-libraries


【解决方案1】:

编译程序时,必须在构建中明确指定库(语言运行时除外),否则将不会包含它们。有一些标准库目录,比如你可以指定-lfoo,它会自动在/usr/lib/usr/local/lib等各种常用目录中查找libfoo.alibfoo.so

但是请注意,像 libfoo.so 这样的名称通常是指向实际库文件名的符号链接,可能类似于 libfoo.so.1。这样,如果需要对 ABI 进行向后不兼容的更改(例如,某些结构的布局可能会更改),则库的新版本将变为 libfoo.so.2,并且与旧版本链接的二进制文件不受影响。

因此链接器遵循符号链接,并将对版本化名称libfoo.so.1 的引用插入到可执行文件中,而不是未版本化名称libfoo.so。它也可以插入完整路径,但通常不会这样做。相反,当可执行文件运行时,系统范围内的/etc/ld.so.conf 中配置了一个系统搜索路径,用于查找库。

(实际上,ld.so.conf 只是您的库搜索路径的人类可读源;为了速度,使用ldconfig 命令将其编译为/etc/ld.so.cache 的二进制形式。这就是为什么您需要运行@ 987654338@ 每次更改系统上的可共享库时。)

这是对正在发生的事情的非常简化的解释。这里没有涵盖更多内容。 Herehere 是一些可能对构建过程有用的参考文档。而here是系统可执行加载器的描述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2014-04-29
    相关资源
    最近更新 更多