什么是ld-linux.so.2和linux-gate.so.1?

e27*_*314 29 linux linkage ldd

当我运行时,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)
Run Code Online (Sandbox Code Playgroud)

你能解释输出和原因,linux-gate.so.1并以ld-linux.so.2不同于其他条目的方式展示吗?他们的角色是什么?

Pet*_*esh 46

我希望您不要询问主要条目,这些条目表明,例如,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),然后将控制权移交给正在执行的二进制文件的起始地址.

该程序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]
Run Code Online (Sandbox Code Playgroud)

  • 道歉,技术术语是*program*interpreter - 我添加了一个段落,详细说明了它所做的大部分工作 (3认同)