动态库链接器/加载器 ld-linux.so.2

Posted rtoax

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态库链接器/加载器 ld-linux.so.2相关的知识,希望对你有一定的参考价值。

/lib64/ld-linux-x86-64.so.2

深入理解LINUX下动态库链接器/加载器ld-linux.so.2_Nicolas_Xu的博客-CSDN博客_ld-linux.so最近在Linux 环境下开发,搞了好几天 Compiler 和 linker,觉得有必要来写一篇关于Linux环境下 ld.so的文章了,google上搜索了很多相关介绍性的文档,发现国内百度上却很少有相关类文档,觉得有必要来梳理一下:ld-linux.so.2 是linux下的动态库加载器/链接器,这篇文章主要来讲一下 ld-linux.so.2 是如何和Linux 以及相关https://blog.csdn.net/elfprincexu/article/details/51701242最近在Linux 环境下开发,搞了好几天 Compiler 和 linker,觉得有必要来写一篇关于Linux环境下 ld.so的文章了,google上搜索了很多相关介绍性的文档,发现国内百度上却很少有相关类文档,觉得有必要来梳理一下:

ld-linux.so.2 是linux下的动态库加载器/链接器,这篇文章主要来讲一下 ld-linux.so.2 是如何和Linux 以及相关应用打交道的。

1. 什么是 ld.linux.so ? 

很多现代应用都是通过动态编译链接的,当一个 需要动态链接 的应用被操作系统加载时,系统必须要 定位 然后 加载它所需要的所有动态库文件。 在Linux环境下,这项工作是由ld-linux.so.2来负责完成的,我们可以通过 ldd 命令来查看一个 应用需要哪些依赖的动态库:

$ ldd /bin/ls
        linux-vdso.so.1 (0x00007ffdab67a000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f99f7af4000)
        libcap.so.2 => /lib64/libcap.so.2 (0x00007f99f7aea000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f99f78e3000)
        libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007f99f784c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f99f7b51000)

当最常见的ls小程序加载时,操作系统会将 控制权 交给 ld-linux.so 而不是 交给程序正常的进入地址。 ld-linux.so.2 会寻找然后加载所有需要的库文件,然后再将控制权交给应用的起始入口。

上面的ls在启动时,就需要ld-linux.so加载器将所有的动态库加载后然后再将控制权移交给ls程序的入口。

ld-linux.so.2 man page给我们更高一层的全局介绍, 它是在 链接器(通常是ld)在运行状态下的部件,用来定位和加载动态库到应用的运行地址(或者是运行内存)当中去。通常,动态链接是 在连接阶段当中 隐式指定的。 gcc -W1 options -L/path/included -lxxx 会将 options 传递到ld 然后指定相应的动态库加载。 ELF 文件提供了相应的加载信息, GCC包含了一个特殊的 ELF 头: INTERP, 这个 INTERP指定了 加载器的路径,我们可以用readelf 来查看相应的程序

 

ELF 规格要求,假如 PT_INTERP 存在的话,操作系统必须创建这个 interpreter文件的运行映射,而不是这个程序本身, 控制权会交给这个interpreter,用来定位和加载所有的动态库,

以上是关于动态库链接器/加载器 ld-linux.so.2的主要内容,如果未能解决你的问题,请参考以下文章

作为由相对路径加载的绝对路径传递给链接器的动态库?

修改 glibc 动态链接器以检查共享库是不是已在另一个进程中加载

linux下库的使用

linux ldconfig命令的作用(Linker Configuration 链接器配置)更新动态链接库(共享库)的链接器程序缓存

在与 Rust 中的本机库链接时将符号公开给动态链接器

vs链接错误解决方法