当前位置: 首页 > 面试题库 >

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

亢雅懿
2023-03-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  ....@.8...@.....
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  ..H....@.H......
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我们看到:

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

该值0x400000SEGMENT_START()该平台上该功能的默认值。

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

% info ld Scripts


 类似资料:
  • 本文向大家介绍什么是Linux软链接和Linux硬链接,包括了什么是Linux软链接和Linux硬链接的使用技巧和注意事项,需要的朋友参考一下 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为软链接(Symbolic Link)。默认情况下,ln命令产生硬链接。 一、[硬链接]-->指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都

  • Linux 是一种计算机操作系统: 一系列能让您与计算机进行交互操作并运行其它程序的程序。 操作系统由多种基础程序构成。它们使计算机可以与用户进行交流并接受指令, 读取数据或将其写入硬盘、磁带或打印机,控制内存的使用,以及运行其它软件。 操作系统最重要的组成部分是内核。在 GNU/Linux 系统中,Linux 就是内核组件。 而该系统的其余部分主要是由 GNU 工程编写和提供的程序组成。 因为单

  • Linux 是一种计算机操作系统: 一系列能让您与计算机进行交互操作并运行其它程序的程序。 操作系统由多种基础程序构成。它们使计算机可以与用户进行交流并接受指令, 读取数据或将其写入硬盘、磁带或打印机,控制内存的使用,以及运行其它软件。 操作系统最重要的组成部分是内核。在 GNU/Linux 系统中,Linux 就是内核组件。 而该系统的其余部分主要是由 GNU 工程编写和提供的程序组成。 因为单

  • Linux 是一种计算机操作系统: 一系列能让您与计算机进行交互操作并运行其它程序的程序。 操作系统由多种基础程序构成。它们使计算机可以与用户进行交流并接受指令, 读取数据或将其写入硬盘、磁带或打印机,控制内存的使用,以及运行其它软件。 操作系统最重要的组成部分是内核。在 GNU/Linux 系统中,Linux 就是内核组件。 而该系统的其余部分主要是由 GNU 工程编写和提供的程序组成。 因为单

  • 伪类选择器,就是基于元素当前所处的状态来选取元素。由于状态通常是动态变化的,当元素处于一个特定状态时,它可能得到一个伪类的样式;当状态改变时,它又会失去这个样式。由此可知,它是基于文档之外的抽象,所以称作伪类。 伪类选择器是CSS 中已经定义好的选择器,不能由用户随便起名,只能按CSS规定的标准格式进行使用。其语法为: 选择器:伪类名 { 属性: 值 } 链接伪类选择器 在CSS中,最常用的伪类选

  • 将 Debian 哲学与方法论,GNU 工具集、Linux 内核,以及其他重要的自由软件 结合在一起所构成的独特的软件发行版称为 Debian GNU/Linux。该发行版由大量的软件 包 组成。发行版中的每个软件包都包含了执行文件、脚本、文档和配置信息, 并拥有一位维护者,其职责是保持软件包更新、跟踪 bug 报告,并与软件源作者保持联络。 我们巨大的用户群,结合 bug 跟踪系统可以确保问题被