ld-linux.so.2和linux-gate.so.1是什么?

44

当我运行ldd program命令时,会得到如下输出:

    linux-gate.so.1 =>  (0xb77ae000)
    libstdc++.so.6 => /lib/libstdc++.so.6 (0xb76bc000)
    libm.so.6 => /lib/libm.so.6 (0xb7691000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7674000)
    libc.so.6 => /lib/libc.so.6 (0xb74c2000)
    /lib/ld-linux.so.2 (0xb77af000)

你能解释一下为什么linux-gate.so.1ld-linux.so.2的输出显示与其他条目不同吗?他们的作用是什么?


虽然你没有询问vdso,但是对于其他人来说,FYI,linux-gate.so.1是32位的,而linux-vdso.so.1是64位的。 - undefined
1个回答

58

我希望您不是在询问主要条目,它们声明所请求的库libm.so.6是在文件/lib/libm.so.6中找到的。对于这两个异常值,您的问题是关于它们为什么显示不同吗?对于linux-gate.so.1,这是因为实际上它不是一个磁盘上的文件,而是由内核作为进行系统调用的机制公开的。对于/lib/ld-linux.so.2,这是因为它是用于实际运行应用程序的程序解释器。

有一篇相当好的博客文章描述了linux-gate.so,并且解释得很清楚。

对于/lib/ld-linux.so.2,您需要了解一些当您启动ELF二进制文件时发生的事情。简短的答案是,这些类型的二进制文件的内核处理程序使用此文件来启动应用程序。

这个程序的主要目的是将二进制文件映射到内存中,在程序中加载任何引用的库(例如先前提到的libm.so.6),然后将控制权移交给正在执行的二进制文件的起始地址。

该程序被定义为ELF文件结构的一部分,在程序头部的INTERP部分中。对于32位linux二进制文件,这是32位解释器的典型名称。对于64位二进制文件,您会发现它通常称为ld-linux-x86_64.so.2(适用于64位x86平台)。

您可以使用readelf -l和INTERP部分自己确定此信息:

INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
               0x000000000000001c 0x000000000000001c  R      1
    [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

"运行时解释器"? 你能详细说明一下吗? - Jonas Schäfer
4
抱歉,技术术语是“程序”解释器-我已经添加了一个段落详细说明它的大部分工作。 - Anya Shenanigans
非常感谢,这正好澄清了我想要解决的困惑:)。很棒,你还解释了混淆可能是如何在查看ELF部分时出现的,我不知道。 - Jonas Schäfer
Wayback Machine正在为“博客条目”链接的页面发出XML,但该XML格式不正确。这导致Firefox显示“XML解析错误:格式不正确”,而不是显示文章内容。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接