当我运行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
linux-gate.so.1
显示不同于其他input的原因吗? 他们的angular色是什么?
我希望你不要问关于这个主要条目的问题,例如,对于所请求的库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
和readelf -l
部分自己确定这些信息:
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238 0x000000000000001c 0x000000000000001c R 1 [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]