linux - 为什么安装的Centos系统使用的是ld.2.17,编译同版本的glibc-2.17却生成ld.so

标签 linux compilation installation linker glibc

我对 ld.so 和 ld-2.17.so 之间的关系感到困惑。具体来说,为什么/lib64/ld-linux-x86-64.so.2 在全新安装的版本中链接到 ld-2.17.so,然后如果我构建相同版本的 glibc (2.17),生成的构建目录显示不同的链接文件?我没有安装任何新的 glib 2.17 可执行文件,只是在规定的 glibc-build 目录中构建它们。

这是 Centos 7.6 的全新安装,来自 centos.org 镜像之一的当前可下载媒体。

$ uname -a
Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

glibc版本是

$ ldd --version

ldd (GNU libc) 2.17
Copyright (C) 2012 Free Software Foundation, Inc.

以及我所知道的已安装链接器。

$ ls -lt /lib64/ld*

lrwxrwxrwx. 1 root root     10 Sep 15 17:43 /lib64/ld-linux-x86-64.so.2 -> ld-2.17.so
-rwxr-xr-x. 1 root root 163400 Oct 30  2018 /lib64/ld-2.17.so

下载 glibc-2.17.tar.gz 后,解压,创建 glibc-build 目录并运行 configure,所有这些似乎都正常工作,我可以看到以下内容 -

$ ls -lt ~build-glibc/elf/ld*

lrwxrwxrwx. 1 root root       5 Sep 16 07:25 ld-linux-x86-64.so.2 -> ld.so
-rwxr-xr-x. 1 root root  850208 Sep 16 07:25 ld.so

ld.so 和 ld-2.17.so 都链接到 ld-linux-x86-64.so.2 但大小有很大不同。它们似乎都是“ELF 64 位 LSB 共享对象,x86-64,版本 1 (SYSV),动态链接”类型。如果它们服务于相同的目的(我不知道它们是这样做的)为什么名称和尺寸存在差异?

我的目标是向 ~/elf/rtld.c 添加一些 printk 语句,以便更好地理解它的作用并复制生成的可执行文件,我认为它应该是 ~/elf/ld.so,因为它们位于同目录,进入lib64目录。我不知道这是否行得通,但我想了解 ld.so 和 ld-2.17.so 在继续之前是否可以互换。或者,也许我正在查看对 rtld.c 所做更改的完全不正确的结果可执行文件?

最佳答案

我了解到 ld.so 是“make”的结果,而 ld-2.17.so 是“make install”的结果。这似乎已通过在配置和制作新的 glibc-2.17 之前设置测试目录得到证明。

来自 glibc-build 目录 -

../glibc-2.17/configure --prefix ~/glibc-build/test
make
make install

并在 test/lib 中找到 ld-2.17.so。

我仍然不确定为什么大小不同或为什么新的 ld-2.17.so 在引导期间核心转储,或者如何/是否可以在/lib64 中安装新的 ld-2.17.so,但这些是不同的问题.

关于linux - 为什么安装的Centos系统使用的是ld.2.17,编译同版本的glibc-2.17却生成ld.so,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57960213/

相关文章:

c++ - 是否有任何 API 或方法可以防止对动态分配的内存进行读访问(和写)?

haskell - 在没有 GHC 的机器上运行 Haskell 脚本

python - 如何在Linux下/usr/local/lib/python2.7/site-packages下安装Pip

sql-server - SSDT 安装程序缺少先决条件 : SQL Server 2016 System CLR Types

django - 无法在 Ubuntu 13.10 上安装 pylibmc(使用 Python 3.3.2)

Python 无法在 Web 浏览器中运行

linux - 如何将 headless (headless)窗口浏览器从远程服务器传输到我的本地计算机?

android ndk 使用 mupdf 库

linux - x11 - ModuleNotFoundError : No module named 'kivy.core.window.window_x11' - Unable to run Kivy

javascript - CDN 托管的 javascript 库与下载和缩小