为什么 Linux/gnu 链接器选择地址 0x400000?

2024-04-14

我正在 Linux x86_64 上试验 ELF 可执行文件和 gnu 工具链:

我已经链接并剥离(手动)“Hello World”测试:

        .global _start
        .text
_start:
        mov     $1, %rax
        ...

转换为 267 字节 ELF64 可执行文件...

0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 3e00 0100 0000 d400 4000 0000 0000  ..>.......@.....
0000020: 4000 0000 0000 0000 0000 0000 0000 0000  @...............
0000030: 0000 0000 4000 3800 0100 4000 0000 0000  [email protected] /cdn-cgi/l/email-protection...@.....
0000040: 0100 0000 0500 0000 0000 0000 0000 0000  ................
0000050: 0000 4000 0000 0000 0000 4000 0000 0000  ..@.......@.....
0000060: 0b01 0000 0000 0000 0b01 0000 0000 0000  ................
0000070: 0000 2000 0000 0000 0000 0000 0000 0000  .. .............
0000080: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000090: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000b0: 0400 0000 1400 0000 0300 0000 474e 5500  ............GNU.
00000c0: c3b0 cbbd 0abf a73c 26ef e960 fc64 4026  .......<&..`.d@&
00000d0: e242 8bc7 48c7 c001 0000 0048 c7c7 0100  .B..H......H....
00000e0: 0000 48c7 c6fe 0040 0048 c7c2 0d00 0000  [email protected] /cdn-cgi/l/email-protection......
00000f0: 0f05 48c7 c03c 0000 0048 31ff 0f05 4865  ..H..<...H1...He
0000100: 6c6c 6f2c 2057 6f72 6c64 0a              llo, World.

它有一个程序头 (LOAD),并且没有任何节:

There are 1 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x000000000000010b 0x000000000000010b  R E    200000

这似乎加载了地址 0x400000 处的整个文件(文件偏移量 0 到 0x10b - elf 标头和所有内容)。

入口点是:

 Entry point address:               0x4000d4

它对应于文件中的 0xd4 偏移量,我们可以看到该地址是机器代码的开头(mov $1, %rax1)

我的问题是 gnu 链接器为什么(如何)选择地址0x400000将文件映射到?


起始地址通常由链接描述文件设置。

例如,在 GNU/Linux 上,查看/usr/lib/ldscripts/elf_x86_64.x we see:

...
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); \
    . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;

价值0x400000是默认值SEGMENT_START()在此平台上发挥作用。

您可以通过浏览链接器手册了解有关链接器脚本的更多信息:

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

为什么 Linux/gnu 链接器选择地址 0x400000? 的相关文章

  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • libusb 和轮询/选择

    我正在使用 Linux 操作系统 想知道是否有任何文件描述符可以轮询 选择 当数据等待从 USB 设备读取时会触发这些文件描述符 我也在使用 libusb 库 但尚未找到可以使用的文件描述符 Use libusb 的轮询函数 http li
  • 页面错误陷阱的成本

    我有一个应用程序 它定期 每 1 或 2 秒后 通过分叉自身来获取检查点 因此 检查点是原始进程的一个分支 它一直保持空闲状态 直到原始进程发生某些错误时被要求启动 现在我的问题是fork的写时复制机制的成本有多大 每当原始进程写入内存页面
  • 使用 gatttool 或 bluepy BLE 订阅通知

    我正在使用 bluepy 编写一个程序 用于监听蓝牙设备发送的特征 我还可以使用任何库或语言 唯一的限制是在 Linux 上运行 而不是在移动环境中运行 似乎仅在移动设备中广泛使用 没有人在桌面上使用 BLE 使用 bluepy 我注册了委
  • 从 gitlab docker runner 启动声纳扫描仪

    我有一个 CI 工作流程 集成了 linting 作业和代码质量作业 我的 Linting 工作是一个 docker runner 从应用程序代码启动我的 eslint 脚本 然后我的代码质量工作应该启动声纳扫描仪泊坞窗实例 检查我的代码并
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组
  • 在 C 中使用 sqrtf():“未定义对‘sqrtf’的引用”

    我正在使用Linux Ubuntu 12 04 https en wikipedia org wiki Ubuntu version history Ubuntu 12 04 LTS 28Precise Pangolin 29 Precis
  • Linux shell 命令逐块读取/打印文件

    是否有一个标准的 Linux 命令可以用来逐块读取文件 例如 我有一个大小为 6kB 的文件 我想读取 打印第一个 1kB 然后是第二个 1kB 看来猫 头 尾在这种情况下不起作用 非常感谢 你可以这样做read n在循环中 while r
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些
  • 操作系统崩溃的常见原因[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有兴趣了解 操作系统崩溃 不限于Windows崩溃 最常见的技术原因 从操作系统编程的角度 有哪些 我正在寻找一个不像 打开太多应用
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • sed 仅最后一个匹配模式

    我想sed仅文本文件的最后一个匹配模式 输入文件 boy boy girl boy 输出文件 boy boy girl boys 一种方法是反转文件 仅替换第一个匹配项 然后再次反转 tac
  • 如何使用 tmuxinator 在 tmux 中拆分水平窗格内的两个垂直窗格

    目前我的 tmuxinator yml 文件中有这个 windows editor layout main horizontal panes vim server rails s 这给了我两个窗口 一个用于编辑器 另一个用于服务器 在编辑器
  • 加载器如何引用共享库中的变量?

    我现在了解如何通过过程链接表引用动态函数 如下所示 Dump of assembler code for function foo plt 0x0000000000400528
  • 如何“grep”连续流?

    可以用吗grep在连续的流中 我的意思是有点tail f
  • 即使 makefile 和源代码存在,为什么“Build Project”在 Eclipse Helios CDT 中显示为灰色?

    我无法构建我的项目 我在 Eclipse Helios 中创建了一个新的 CDT 项目 并告诉它使用现有的源代码和 makefile 这两者都正确显示在 Package 和 Project 视图中 然而 项目 菜单中的 构建全部 和 构建项
  • 为什么使用Python的os模块方法而不是直接执行shell命令?

    我试图了解使用Python的库函数执行特定于操作系统的任务 例如创建文件 目录 更改文件属性等 背后的动机是什么 而不是仅仅通过执行这些命令os system or subprocess call 例如 我为什么要使用os chmod而不是
  • 使用 sed 将 old-link-url 替换为 new-link-url

    我正在 bash 中编写一个脚本 将 old link url 替换为 new link url 我的问题是 sed 由于斜杠而无法替换 url 如果我只输入一些文字就可以了 my code sed e s old link new lin
  • Linux TCP服务器:在接受连接之前读取客户端的IP地址

    Related C Winsock API如何在接受连接之前获取连接客户端IP https stackoverflow com questions 716209 c winsock api how to get connecting cli
  • Docker DNS 设置

    我尝试使用自定义网络和 dos 设置创建 docker 容器 docker网络创建 driver bridge opt com docker network bridge enable ip masquerade true opt com

随机推荐

  • 如何将fasttext模型保存为vec格式?

    我使用以下方法训练了我的无监督模型fasttext train unsupervised python 中的函数 我想将其保存为 vec 文件 因为我将使用该文件pretrainedVectors参数输入fasttext train sup
  • Android MVVM 设计模式

    我在最近发布的 Android 最佳实践 一书中读到 用于 Android 编程的一个很好的设计模式是 MVVM 我自己在最新的项目中尝试过 它似乎确实有利于将代码分成更易于管理的部分 View 仅处理视图项的创建和 ViewModel 的
  • 使用 JSON asp.net core api 上传多部分/表单数据图像

    如何在单个 POST 中同时 POST 图像和 JSON 使用多部分 我有一个表单 其中包含一些数据 我将其放入 JSON 中 用户可以添加 0 到 6 张照片并将其提交到 API 有人可以解释我该怎么做吗 编辑 感谢您的帮助 这是我的代码
  • 如何使用Flutter Desktop打开windows资源管理器?

    I want to open the windows explorer application not open a dialog for example the Edge s display in a folder 你可以通过file 目
  • 为什么 Symfony 表单不使用约束注释验证我的 DTO?

    所以我有一个 DTO 如下所示 namespace App DTO use Symfony Component Validator Constraints as Assert class Task Assert Type string As
  • 内核编程中如何执行shell命令?

    我想用system 的函数stdlib h在我的c代码中 我实际上正在从事内核编程 每当我想使用system 其中 它给出了错误stdlib h说没有找到这样的文件 这很简单 include
  • Xcode 新手如何创建类 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何从区分大小写的查询参数变量中获取值?

    我有一个带有查询字符串的 URLid 但是 变量id可以作为 id 或 id 在网址中 根据我的理解 这两个将被区别对待 为了处理以下 URL 我编写了如所附屏幕截图中的代码 http xxx abc id 10 http xxx abc
  • 如何用 Marshal.SizeOf() 替换 Marshal.SizeOf(Object)?

    我正在构建一个普遍的现有代码中的类库 我收到一些编译器警告 我一生都无法弄清楚如何处理 我有这样的代码 void SomeMethod Object data var size Marshal SizeOf data 代码构建 但在普遍的项
  • 如何将参数传递给asp.net web api get方法?

    以下是我在 ASP NET Web API 中的 get 方法 HttpGet public IHttpActionResult GetDetails FromBody RetrieveDetails eDetails 以下是课程 publ
  • 为什么我应该使用 HttpClient 而不是 fetch?

    Angular 2 介绍HttpClient它发出一个 HTTP 请求并将它们发送到一个 RxJS observable 中 我的问题是为什么我会选择使用HttpClient s API https angular io guide htt
  • 检查Java版本是否大于Java中的某个迭代?

    我想检查用户的 Java 版本是否至少为 1 8 0 171 我的意思是特定迭代或更高版本 例如 1 8 0 151 将不起作用 我原本计划使用 org apache commons lang3 SystemUtils isJavaVers
  • C# 如何检查一个对象是否是多维数组

    我是 C 的新手 我有一个 C 对象 如何检查它是单维数组还是多维数组 int array new int 2 3 object obj object array if obj is Array if obj Rank 2 I need t
  • 如何增加谷歌语音API的收听时间?

    我已经使用谷歌语音到文本 api 制作了一个工作语音到文本程序 该程序记录语音并将其复制到 txt 中 但是 谷歌语音 api 不会监听很长时间 大约 9 秒 有什么办法可以增加这个时间 或者在 python 中使用更好的 api 可以边听
  • 检测页面是在三星股票浏览器中查看还是作为独立的网络应用程序查看

    正如标题所述 我试图检测我的网页是否被视为三星股票浏览器中的网页 或者是否作为保存在主屏幕上的独立网络应用程序打开 但据我所知 我发现的 javascript 代码只适用于 Safari 和 Chrome 有人可以为此提供一个好的解决方案吗
  • PHP - htmlspecialchars 和 UTF-8

    我只是想确认一些事情html特殊字符 http php net manual en function htmlspecialchars php 我刚刚将数据库转换为 UTF 8 我想我终于可以正常工作了 但是在我的代码中我使用了PHP ht
  • 在 Go 中生成长随机字符串的最快方法是什么?

    像 a zA Z0 9 字符串 na1dopW129T0anN28udaZ 或十六进制字符串 8c6f78ac23b4a7b8c0182d 我所说的 长 是指 2K 及更多字符 我的盒子上的速度约为 200MBps 显然还有改进的空间 ty
  • 是否还能获取Skype用户的在线状态?

    正如标题所说 API 服务发生 重大 变化后 是否仍然可以在 Skype 上查看用户的状态 在线 离线 忙碌 开发者部分现在看起来非常非常有限 http developer skype com http developer skype co
  • 从类库项目中的 App.config 读取

    我正在开发一个简单的类库项目 这会给我一个 dll 我想从配置文件中读取特定值 所以我在我的项目中添加了一个 App config 文件
  • 为什么 Linux/gnu 链接器选择地址 0x400000?

    我正在 Linux x86 64 上试验 ELF 可执行文件和 gnu 工具链 我已经链接并剥离 手动 Hello World 测试 global start text start mov 1 rax 转换为 267 字节 ELF64 可执