为什么在Ubuntu 18.04上以这种方式为ELF64 LD映射段

问题描述 投票:0回答:1

使用中

GNU ld(适用于Ubuntu的GNU Binutils)2.30

在makefile中

应用程序:App.o Init.o SubRtx.old -oApp SubRtx.o Init.o App.oApp.o:App.asmnasm -g -felf64 App.asm -oApp.oInit.o:Init.asmnasm -g -felf64 Init.asm -oInit.oSubRtx.o:SubRtx.asmnasm -g -felf64 SubRtx.asm -oSubRtx.o清洁:rm * .o应用

以下列方式映射段。

[1] .text PROGBITS 4000b0 0000b0 00023f 00 AX 0 0 16[2] .rodata程序4002f0 0002f0 000018 00 A 0 0 16[3] .data PROGBITS 600310 000310 0000d0 00 WA 0 0 16

在我的汇编文件中,节仅声明为section .datasection .rodata,而根据设计,App.o是唯一具有。data节的文件,因此这就是为什么它被映射为@ 0x600310

我可能会与Windows甚至ELF32混淆,但是我似乎想记得默认情况下从4K边界开始的段。 IE:.data将为@ 0x600000或至少为0x601000,但是将TEXT节的内容直接从0x400000复制到DATA,然后直到0x310才开始DATA似乎是不必要的浪费。

故意,我的应用程序是完全独立的(静态链接),并且仅通过SYSCALL与OS接口。代码按预期方式工作,我什至擦除了0x600000-> 0x60030f的内容,而没有负面影响,但是仍然很好奇为什么会这样。

nasm ubuntu-18.04 ld elf
1个回答
0
投票

以下列方式映射段。

这些是节,不是段(它们是不一样的东西。]

。data应该是@ 0x600000

[不可能从可执行文件中的偏移量mmap开始的数据段到不等于0x310模数页面大小的内存中的任何位置。

另请参见0x310

© www.soinside.com 2019 - 2024. All rights reserved.