当我运行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.1ld-linux.so.2显示与其他条目不同的原因吗?他们的角色是什么?

推荐答案

我希望您不是在询问主要条目,例如,对于请求的库libm.so.6,它是在文件/lib/libm.so.6中找到的,而是询问两个异常值.

为什么它们的显示方式不同?对于linux-gate.so.1,这是因为它实际上不是磁盘上的一个文件——它被内核作为进行系统调用的机制公开.对于/lib/ld-linux.so.2来说,这是因为这是用于实际运行应用程序的program解释器.

有一个非常好的blog entry描述linux门.所以,它很好地解释了这一点.

对于/lib/ld-linux.so.2,你必须了解一点当你emits 一个ELF二进制时会发生什么.简而言之,这些类型二进制文件的内核处理程序使用该文件来启动应用程序.

该程序的主要目的是将二进制文件映射到内存中,加载程序中的任何引用库(例如前面提到的libm.so.6),然后将控制权移交给正在执行的二进制文件的起始地址.

该程序被定义为ELF文件 struct 的一部分,位于程序头的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]

Linux相关问答推荐

无法在Raspberry PI 3 Model B上分配256TB的虚拟内存

如何检测文件系统是否支持权限?

AWK+向AWK导出值未传递

+后移动下一行到当前行

linux shell 脚本获取文件夹中

为什么我的 Docker 进程不断在我的 Raspberry Pi 上重新启动?

用户级线程如何与内核级线程对话

awk 不打印所需的 df 输出

我应该如何从非 root Debian Linux 守护进程登录?

为什么我不能将 Unix Nohup 与 Bash For 循环一起使用?

在 64 位 Linux 操作系统上编译 32 位程序导致致命错误

Linux 上的 C++ 开发 - 我从哪里开始?

使用 linux 命令行 (bash) 从网络摄像头拍照

将 bash 脚本添加到路径

zsh/bash 上不区分大小写的 Glob

Linux上C中的标准输出线程安全?

我可以打开一个套接字并将其传递给 Linux 中的另一个进程吗

grep 递归查找 Linux 上的特定文件类型

如何用逗号而不是空格分割列表

在tmux中绑定Ctrl+Tab和Ctrl+Shift+Tab