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