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?
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