当我运行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
显示的原因与其他条目不同吗?他们的角色是什么?
答案 0 :(得分:43)
我希望您不要询问主要条目,这些条目表明,对于所请求的库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),然后将控制权移交给正在执行的二进制文件的起始地址
此程序在程序头的INTERP
部分中定义为ELF文件结构的一部分。对于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]