一、说明
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!)