40

当我运行时,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.1,并ld-linux.so.2显示出与其他条目不同的地方吗?他们的角色是什么?

4

1 回答 1

57

我希望您不是在询问主要条目,例如,对于请求的库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]
于 2013-11-14T15:47:33.327 回答