gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:23:01 25 4
gpt4 key购买 nike

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

我已经(手动)链接并剥离了一个“Hello World”测试。s:

        .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 header 和所有文件)。

入口点是:

 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;

0x400000 是此平台上 SEGMENT_START() 函数的默认值。

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

% info ld Scripts

关于linux - 为什么 Linux/gnu 链接器选择地址 0x400000?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14314021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com