Я изучаю расположение исполняемых файлов. Моя конечная цель - проанализировать конкретный исполняемый файл на предмет того, что можно реорганизовать (в его источнике), чтобы уменьшить размер скомпилированного вывода.
Я использовал https://www.embeddedrelated.com/showarticle/900.php и https://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
- true?
Что означает это значение, 0x400000
? Возможно, я что-то не правильно понимаю, но, конечно же, 0x400000
не представляет физическую ячейку памяти, не так ли? Например. если бы я запускал два экземпляра моего скомпилированного a.out
параллельно, они не могли бы оба одновременно занимать пространство на 0x400000
, верно?