Исходя из моего понимания, программа на C / C ++ выглядит в памяти примерно так:
Я хотел знать следующее:
Спасибо,
Это зависит от операционной системы; Я отвечаю только за Linux.
Во-первых, на практике ваша цифра совершенно неверна, поскольку большинство программ динамически связаны с несколькими общими библиотеками объектов (включая libc6.so
…). Смотрите также ld.so (8), Эльф (5), execve (2). Здесь нет не замужем text
раздел (но многие «текстовые», как сегменты). Читайте о ртар а также objdump команды.
Затем вы можете понять адресное пространство процесса pid 1234 с cat /proc/1234/maps
; узнать больше о Proc (5)… Изнутри программы читайте /proc/self/maps
; например попробуйте cat /proc/$$/maps
в оболочке, чтобы показать адресное пространство процесса оболочки, и cat /proc/self/maps
для адресного пространства запущенного процесса, который cat
команда. Смотрите также ММАП (2).
Вы не можете действительно «переместить» (вы на самом деле имеете в виду «переместить») текстовый раздел. Некоторые адреса встроены в код. Тем не менее, прочитайте о -опция fPIE из gcc
(за независимый от позиции исполняемый файл ….).
Конечно, вы можете получить доступ к символам программы (изнутри), если связать ее с -rdynamic флаг и если вы используете dlopen (3) (а также dlsym
и даже возможно dladdr
….) с NULL
первый filename
аргумент.
Смотрите также википосты о адресное пространство, виртуальная память, ASLR, позиционно-независимый код, перемещение, ABI, JIT сборник, название искажения и x86-64 ABI spec и Расширенное программирование в Linux книга.
Других решений пока нет …