I'm learning about the layout of executable binaries. My end goal is to analyze a specific executable for things that could be refactored (in its source) to reduce the compiled output size.
I've been using https://www.embeddedrelated.com/showarticle/900.php and https://www.geeksforgeeks.org/memory-layout-of-c-program/ as references for this initial learning.
From what I've learned, a linker script specifies the addresses where sections of compiled binaries are placed. E.g.
> 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.*)
I think this means that the text
segments of compiled binaries starts at memory address 0x400000
- true?
What does that value, 0x400000
, represent? I'm probably not understanding something properly, but surely that 0x400000
does not represent a physical memory location, does it? E.g. if I were to run two instances of my compiled a.out
executable in parallel, they couldn't both simultaneously occupy the space at 0x400000
, right?