获取 ld 的搜索路径以及临时添加搜索路径的办法(内核开发实践笔记)

获取 ld 的搜索路径以及临时添加搜索路径的办法(内核开发实践笔记)

文一

2024-09-07 发布38 浏览 · 0 点赞 · 0 收藏

现在,当有所为,有所积淀,继续学习内核研发知识,为推动 PostgreSQL 的前进而继续奋斗。

在了解今天所记录的内容之前,我们首先需要对一些前置的内容做一些相应的了解,参考下面的内容。

链接文件与库文件

在我们使用C语言编写代码,并且将其编译为面对对象文件之后,其下一步的工作,便在于将它同其余的既有的库文件(这些库文件,可能来自于同一工程下面的内容,如 PostgreSQL 的 psql 客户端工具,就需要依托 PostgreSQL libpq 客户端库展开工作,也有可能来自于外部的内容,如 PostgreSQL 的 xml 函数功能,就需要 libxml 库提供相关的支持),整合链接,原理如图所示:

intro

而库文件,即是面对对象文件的一组集合,而链接,便是对这些文件的集中整合(不过我们必须注意到的事情是,库文件也分为静态库文件与动态库文件,后者需要我们将对应的动态链接文件同工程一同发行)。

而在 gcc 编译工具集合中,ld 承担着链接文件与整合文件的职责,我们今天所讨论的问题,就将围绕 ld 而展开。

ld 的 搜索路径(search path)

想要链接文件,整合资源,首当其冲,就应当了解文件的路径之所在,而搜索的路径,显然即建立于此基础之上,试举一例,倘若我们希望找到《贞观政要》,则可以提出如下之可能性:

在书柜中的《贞观政要》
在床底中的《贞观政要》
在书桌中的《贞观政要》

这些假设出来的“可能在的位置”,与 ld 搜索路径的道理,实际上一路相通,在我们通过 -l 指定对应的动态链接库的时候,ld 就会自自身假定好的一组搜索路径中,展开查询,看看能否找到对应的文件,加载并整合到可执行文件之中。

而想要获取到对应的搜索路径,以查找 libpq 库为例,我们可以执行下面的指令:

ld -lpq --verbose

而执行的结果,可以是如图所示:

pq-result

(可以发现,在所有可能的目录均宣告失败之后,ld 即反馈:ld: cannot find -lpq: No such file or directory 错误)

而如果我们了解库文件所在的目录的情况下,可以通过 -L 动态添加目录,又如图所示:

# 在我的环境中,我将 PostgreSQL 库文件安装于下面的地址以便开发
ld -lpq --verbose -L /home/wenyi/postgres/lib

result

写在最后

感谢一路上一直伴我同行之人,疾风知劲草,日久见人心,真可谓是如此!