gpt4 book ai didi

c - 操作系统如何在两个不同的链接中找到共享库路径? :run-time linking (loading) and compile time linking shared library in linux

转载 作者:太空宇宙 更新时间:2023-11-04 12:17:12 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

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

关于c - 操作系统如何在两个不同的链接中找到共享库路径? :run-time linking (loading) and compile time linking shared library in linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47105300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com