微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么Linux / GNU链接器select地址0x400000?

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

我已经链接并剥离了一个“Hello World”testing。

.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]...@..... 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]...... 00000f0: 0f05 48c7 c03c 0000 0048 31ff 0f05 4865 ..H..<...H1...He 0000100: 6c6c 6f2c 2057 6f72 6c64 0a llo,World.

它有一个程序头(LOAD),没有部分:

将部分添加到ELF文件

如何挂钩一个特定的共享ELF库函数

奇怪的ELF二进制

为什么Linux二进制文件的虚拟内存地址从0x8048000开始?

SYSV与Linux / GNU ELF格式

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 RE 200000

这似乎加载在地址0x400000整个文件文件偏移0到0x10b – 小精灵头和全部)。

入口点是:

Entry point address: 0x4000d4

这对应于文件中的0xd4偏移量,正如我们所看到的,地址是机器码的开始( mov $1,%rax1 )

我的问题是为什么(如何)的GNU链接器select地址0x400000映射文件

链接错误:布局错误:对于数据而言,部分大小太小

为什么函数在x86 Linux的alignment地址加载elf可执行文件

为什么select地址0x400000作为x86_64 ABI文本段的开始?

如何在elf文件中获得用户定义的函数范围(开始和结束地址)?

__gmon_start在_start之前执行

起始地址通常由链接器脚本设置。

例如,在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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐