2013-11-14 38 views
23

当我运行ldd program我得到的形式什么是ld-linux.so.2和linux-gate.so.1?

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显示出比其他项目不同?他们的角色是什么?

回答

40

我希望您不要询问主要条目,例如对于请求的库libm.so.6发现它在文件/lib/libm.so.6中找到,但询问有关这两个异常。

他们为什么显示不同?对于linux-gate.so.1,这是因为它实际上并不是磁盘上的文件 - 它作为进行系统调用的机制被内核暴露。对于/lib/ld-linux.so.2,这是因为这是用于实际运行应用程序的程序解释程序。

有一个很不错的blog entry描述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] 
+0

“运行时解释”?你能详细说一下吗? –

+2

道歉,技术术语是*程序*解释器 - 我已经添加了一个段落,详细介绍了它所做的大部分工作 – Petesh

+0

非常感谢,这清楚了我正在瞄准的困惑:)。非常棒的是,你也解释了看ELF部分可能出现的混乱,我不知道。 –