运行时,ldd program我得到表格的输出
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
ld-linux.so.2
我希望您不要询问主要条目,这些条目说明例如libm.so.6在文件中找到了所请求的库/lib/libm.so.6,而是询问了两个离群值。
libm.so.6
/lib/libm.so.6
为什么它们显示不同?为linux-gate.so.1这是因为它实际上不是在磁盘上的一个文件-它是由内核的机制来进行系统调用暴露。对于/lib/ld- linux.so.2它,因为这是 程序 被用于实际运行的应用程序的解释。
/lib/ld- linux.so.2
有一个很好的博客条目描述了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平台)。
INTERP
ld- linux-x86_64.so.2
您可以使用readelf -l和INTERP部分自己确定此信息:
readelf -l
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238 0x000000000000001c 0x000000000000001c R 1 [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]