动态链接器是 Linux 系统上内核或 GCC 库的一部分吗?

2023-11-26

动态链接器(又名程序解释器、链接加载器)是内核或 GCC 库的一部分吗?

UPDATE(28-08-16):

我发现默认路径为动态链接器每个二进制文件(即链接到共享库)都使用/lib64/ld-linux-x86-64.so.2是共享库的链接/lib/x86_64-linux-gnu/ld-2.23.so这是实际的动态链接器。

它是的一部分libc6 (2.23-0ubuntu3)包即。GNU C 库:共享库在 ubuntu 中适用于 AMD64 架构。

我的实际问题是

如果这个帮助程序(ld-2.23.so)不存在?

答案是“任何应用程序都不会运行,即使是 shell 程序”。我在虚拟机上试过了。


在 ELF 可执行文件中,这称为“ELF 解释器”。在 Linux 上(例如)这是/lib64/ld-linux-x86-64.so.2

This is not内核的一部分并且[通常]与glibc et. al.

当内核执行 ELF 可执行文件时,它必须将可执行文件映射到用户空间内存。然后它会在内部查找一个特殊的子部分,称为INTERP[其中包含一个完整路径的字符串]。

然后内核将解释器映射到用户空间内存并将控制权转移给它。然后,解释器进行必要的链接/加载并启动程序。

Because ELF代表“可扩展链接器格式”,这允许 ELF 文件有许多不同的子部分。

与文件配对的 ELF 解释器知道,而不是给内核增加必须了解所有无数扩展的负担。

虽然给定系统上通常只使用一种格式,但系统上可能存在几种不同的 ELF 文件变体,每个变体都有自己的 ELF 解释器。

这将允许 [比如说] BSD ELF 文件在 Linux 系统上运行 [通过其他调整/支持],因为 ELF 文件将指向 BSD ELF 解释器而不是 Linux 解释器。


UPDATE:

每个进程(vlc 播放器、chrome)都有共享库 ld.so 作为其地址空间的一部分。

是的。我假设你正在看/proc/<pid>/maps。这些都是mappings(例如,像使用mmap) 到文件。这与“正在加载”有些不同,“正在加载”可能意味着[符号]linking.

因此,主要是加载程序在将可执行文件(代码和数据)加载到内存后,加载动态链接器(.so)并将其映射到其地址空间

理解这一点的最好方法是重新表述您刚才所说的话:

所以主要是内核 after mapping可执行文件(代码和数据)到内存中,内核将动态链接器 (.so) 映射到该程序地址空间

这基本上是正确的。内核还映射其他东西,例如bss段和堆栈。然后它“推”argc, argv, and envp[环境变量的空间]入栈。

然后,确定了起始地址ld.so[通过读取文件的特殊部分],它将其设置为恢复地址并启动线程。

到目前为止,一直都是内核在做事。内核几乎不执行任何符号操作linking.

Now, ld.so接手 ...

进一步加载共享库,映射和解析对库的引用。然后调用入口函数(_start)

因为原始可执行文件(例如vlc)已被映射到内存中,ld.so可以检查它以获取所需的共享库列表。它maps这些进入内存,但确实not一定link立即显示符号。

绘制地图既简单又快捷——只需mmap call.

可执行文件的起始地址[not与起始地址混淆ld.so],取自 ELF 可执行文件的特殊部分。虽然,与该起始地址相关的符号传统上被称为_start,它实际上可以被命名为任何东西(例如__my_start)因为节数据中的内容决定了起始地址和not符号的地址_start

将符号引用链接到符号定义是一个耗时的过程。因此,这会被推迟到实际使用符号时。也就是说,如果一个程序引用了printf,链接器实际上并不尝试链接printf直到程序第一次实际执行calls printf

这有时称为“按需链接”或“按需链接”。在这里查看我的回答:哪些段受到写时复制的影响?更详细的解释以及当可执行文件映射到用户空间时实际发生的情况。

如果你有兴趣,你可以这样做ldd /usr/bin/vlc获取它使用的共享库的列表。如果你看一下输出readelf -a /usr/bin/vlc,您将看到这些相同的共享库。另外,你会得到 ELF 解释器的完整路径,并且可以这样做readelf -a <full_path_to_interpreter>并注意一些差异。您可以对任何重复该过程.so文件vlc wanted.

将所有这些与/proc/<pid>maps等等人。可能有助于你的理解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态链接器是 Linux 系统上内核或 GCC 库的一部分吗? 的相关文章

随机推荐

  • Kotlin 和 Gradle - 从 stdio 读取

    我正在尝试使用以下命令执行我的 Kotlin 类 gradlew q run lt src main kotlin samples input txt 这是我的HelloWorld kt class package samples fun
  • 为什么 IE8 不处理 iframe onload 事件?

    示例代码 a href http www example com target self Go a
  • Appengine:put_async 不起作用(至少在开发服务器中)?

    NOTE 它在生产中确实有效 我的意思是 当我上传应用程序时 它运行得很好 问题出在开发服务器上 这里有一些代码可以向您展示我正在尝试做什么 e Employee key name some key name name John Bonha
  • Codeigniter - 按字母顺序排列活动记录

    我想知道是否有人可以帮助我解决一些问题 我有一些 ajax 可以调用我的模型中的函数 但我似乎无法按 模型 对输出进行排序 在函数下面我遇到了问题 function get models by brand tree null this gt
  • 警告修复后将被初始化

    晚上好 感恩节快乐 我有以下代码 从我的主代码中取出到一个独立文件中 并且收到一些我想解决的警告消息 这是代码 include
  • 数学函数在现代处理器上需要多少周期

    我们知道现代处理器执行诸如cosine and sin直接在处理器上 因为它们有操作码 我的问题是这些指令通常需要多少周期 它们需要恒定的时间还是取决于输入参数 该时间因处理器型号而异 时间范围通常从数十个 CPU 周期到一百个或更多 许多
  • 查找 UIView 中某个类型的所有控件

    我正在寻找一种自动本地化按钮 文本字段等上的文本的方法 对于此方法 我需要找到 UIView 上的所有 例如 UIButton 我尝试了以下两种方法 但它们都没有像我希望的那样工作 for UIView subView in self vi
  • 如何更改 WPF DataGridColumn 上的第一个排序方向

    现在 默认 当您单击用户可排序的标题时DataGridColumn它在第一次单击时按升序排序 在第二次单击时按降序排序 如何使其在第一次单击时降序排序 在第二次单击时升序排序 我想出了一种方法 不确定这是否是最好的方法 但基本上 当排序事件
  • 将文本中的 YouTube URL 替换为其 HTML 嵌入代码

    如果在字符串中找到此函数 则嵌入 YouTube 视频 我的问题是 仅捕获嵌入视频 iframe 如果有更多视频 则仅捕获第一个视频 并忽略字符串的其余部分的最简单方法是什么 function youtube string autoplay
  • 可以跨 APK 共享资源吗?

    是否可以跨 APK 共享资源 例如 应用程序 A 在 APK A 中 可以从应用程序 B 在 APK B 中 加载图标或布局视图吗 您可以利用获取应用程序资源 这样 只要您至少知道包名称以及要加载的资源的 id 或名称 您就可以从其他应用程
  • Rails will_paginate 自定义路线

    如何将 will paginate 与自定义路由一起使用 我的路线中有以下内容 map connect human readable name controller gt tags action gt show 但据我所知 will pag
  • Eclipse 中的 JavaCompiler 为空

    我的 Java 编译器出现一些错误 我在 Eclipse 之外没有收到错误 但它似乎只发生在 Eclipse Indigo 中 这不是必需的 但如果您有答案 我将非常感激 因为它将帮助我更轻松地调试和测试资源 谢谢您阅读此篇 E ToolP
  • Asp.net core Identity“INSERT语句与FOREIGN KEY约束冲突”

    我使用 ASP NET CORE Identity 创建 ASP NET CORE 应用程序 我创建种子类来保存首次启动应用程序的新用户和角色 在这个种子类中 当我将角色添加到用户时 我收到以下错误 INSERT 语句与 FOREIGN K
  • 如何在 JBoss 中使用 Java“热代码替换”?

    我正在运行 JBoss 4 0 3 SP1 CP04 并使用 Eclipse 3 4 1 的调试器连接到它 两者都使用 JDK 1 6 0 11 当我对方法进行微小更改 例如 将逻辑中的 1 更改为 2 并保存它时 我立即收到标题为 热代码
  • JavaScript 中的 HTML 图像到 pdf 转换器

    HTML 代码 img class imagepdf src www images com someimage alt Smiley face height 42 width 42 我想将此图像转换为 pdf 格式 我在用jspdf 为此
  • 实体的键不符合键值编码

    if win Game was won set completed in puzzle and time Calculate seconds taken int timeTaken int NSDate timeIntervalSinceR
  • Bootstrap 按钮在移动设备上“卡住”

    Whenever I click a button with my mobile device android on a twitter boostrap button but button gets odd styling like th
  • 设置 float:left 时将 div 扩展到最大宽度

    我有类似的东西 div style width 100px menu div div content div 两个浮标都是必需的 我希望内容 div 填满整个屏幕 减去菜单的 100 像素 如果我不使用 float 则 div 会完全按其应
  • 用于不平衡多类多标签分类的神经网络

    如何处理训练神经网络时多标签分类结果不平衡的问题 我遇到的解决方案之一是惩罚罕见标记类的错误 这是我设计网络的方式 类数 100 输入层 第一隐藏层和第二层 100 通过 dropout 和 ReLU 全连接 第二个隐藏层的输出是 py x
  • 动态链接器是 Linux 系统上内核或 GCC 库的一部分吗?

    动态链接器 又名程序解释器 链接加载器 是内核或 GCC 库的一部分吗 UPDATE 28 08 16 我发现默认路径为动态链接器每个二进制文件 即链接到共享库 都使用 lib64 ld linux x86 64 so 2是共享库的链接 l