Linux / ld 和 ld.so 命令的区别

文章详细介绍了Linux系统中ld链接器和ld.so动态链接器的作用及生命周期。ld链接器在编译时工作,负责连接库,其参数由gcc传递。ld.so在运行时加载动态库,遵循特定的搜索路径,如/etc/ld.so.conf和$LD_LIBRARY_PATH。同时,文章提到了ld-2.28.so是一个PIEexecutable而非sharedlibrary。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、说明

ld 链接器,它的生命周期是发生在 compile-time 的,它的一些参数是编译时期 gcc 给传递的。比如,指定需要链接什么库。

ld.so 的周期是发生在 run-time 的,名字叫动态链接器 / 加载器,它的作用体现在运行时。比如你链接了指定的库,它运行的时候会根据指定的路径去加载指定的库。

而命令 ld.so 相应的配置文件是 /etc/ld.so.conf,这是个文本文件,里面可以增加修改 so 库的搜索路径(与windows下是有区别的,windows下动态库是先搜索当前目录,再去环境变量 PATH 中搜索,再到系统路径下去搜索),当然也可以通过定义一个 $LD_LIBRARY_PATH 的环境变量来指定运行时的搜索路径。所以,这个配置文件是不可以被 ld 链接器使用的,也就是说 ld 的时候,需要加入 -L 这个搜索路径参数。

二、本来面目

1、ld

$ ls -ahl /usr/bin/ld
lrwxrwxrwx 1 root 0 19 6月   7  2021 /usr/bin/ld -> x86_64-linux-gnu-ld
$ ls -ahl /usr/bin/x86_64-linux-gnu-ld
lrwxrwxrwx 1 root 0 23 6月   7  2021 /usr/bin/x86_64-linux-gnu-ld -> x86_64-linux-gnu-ld.bfd
$ ls -ahl /usr/bin/x86_64-linux-gnu-ld.bfd
-rwxr-xr-x 1 root 0 1.7M 6月   7  2021 /usr/bin/x86_64-linux-gnu-ld.bfd
$ file /usr/bin/x86_64-linux-gnu-ld.bfd
/usr/bin/x86_64-linux-gnu-ld.bfd: ELF 64-bit LSB executable, x86-64, 
version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, 
for GNU/Linux 3.2.0, BuildID[sha1]=ec010f2c19950fed8f42d82eceb7e3fb127a5fea, stripped

2、ld.so

$ ls -ahl /lib64/ld-linux-x86-64.so.2 
lrwxrwxrwx 1 root 0 32 10月 21 16:25 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.28.so
$ file /lib/x86_64-linux-gnu/ld-2.28.so
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=d20480dc32316e1607ad2a3d820689548860b5fd, stripped

发现:ld-2.28.so 是一个  pie executable,而不是 shared library 。

(SAW:Game Over!)

### ldconfig 配置文件路径 `ldconfig` 的主要配置文件位于 `/etc/ld.so.conf`,这是系统的全局配置文件[^1]。此文件中可以指定动态链接库的搜索路径。此外,在现代 Linux 系统中,通常会通过 `include /etc/ld.so.conf.d/*.conf` 来引入其他配置文件[^4]。这意味着 `/etc/ld.so.conf.d/` 目录下的所有 `.conf` 文件都会被读取并作为额外的库路径。 当需要添加新的库路径时,可以通过以下两种方式实现: 1. **编辑 `/etc/ld.so.conf` 或创建子配置文件** 将新路径直接写入 `/etc/ld.so.conf` 中,或者更常见的方式是在 `/etc/ld.so.conf.d/` 下新建一个 `.conf` 文件并将路径写入其中[^3]。之后运行 `sudo ldconfig` 命令刷新缓存即可生效。 2. **使用环境变量 LD_LIBRARY_PATH** 如果不想修改系统级配置文件,也可以通过设置环境变量 `LD_LIBRARY_PATH` 来临时或永久添加库路径[^5]。这种方式适用于特定用户的场景,而不影响整个系统。 以下是查看当前已加载库路径的方法: ```bash cat /etc/ld.so.conf ls /etc/ld.so.conf.d/ ``` 执行以下命令可验证新增加的库是否已被识别: ```bash sudo ldconfig -v | grep your_library_name ``` ### 示例:向系统添加自定义库路径 假设有一个第三方库位于 `/opt/mylib/lib`,可通过如下方法将其加入动态链接库路径: 1. 创建一个新的配置文件: ```bash echo "/opt/mylib/lib" > /etc/ld.so.conf.d/mylib.conf ``` 2. 刷新缓存: ```bash sudo ldconfig ``` #### 注意事项 - 修改 `/etc/ld.so.conf` 及其子目录中的文件需具备管理员权限。 - 使用 `LD_LIBRARY_PATH` 添加路径仅对当前 shell 有效,除非将其导出至全局环境变量文件(如 `/etc/profile` 或 `~/.bashrc`)[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值