SEGMENT_START(“text-segment”,0x400000)代表什么?

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

我正在学习可执行二进制文件的布局。我的最终目标是分析一个特定的可执行文件,用于可以重构的内容(在其源代码中),以减少编译的输出大小。

我一直在使用https://www.embeddedrelated.com/showarticle/900.phphttps://www.geeksforgeeks.org/memory-layout-of-c-program/作为这个初步学习的参考。

根据我所学到的,链接描述文件指定了已编译二进制文件的部分所在的地址。例如。

> ld --verbose | grep text
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
      *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)

我认为这意味着编译的二进制文件的text段开始于内存地址0x400000 - 是吗?

这个价值是什么,0x400000,代表什么?我可能不理解正确的东西,但肯定0x400000不代表物理内存位置,是吗?例如。如果我要并行运行我编译的a.out可执行文件的两个实例,它们不能同时占用0x400000的空间,对吧?

linker binaryfiles ld binutils memory-layout
1个回答
4
投票

0x4000000不是物理地址,就像你的内存芯片看到的那样。从CPU的角度来看,这是一个虚拟地址。

程序的加载程序会将几页物理内存映射到VA 0x400000并将text-segment的内容复制到它。是的,你的程序的另一个实例可能占用text-segment的相同物理和虚拟内存块,因为文本(代码)是可读的和可执行的但不可写。其他段(数据,bss,堆栈,堆)可能具有相同的VA,但每个段都将映射到其私有受保护的物理内存块。

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