Доступ к разделу кода программы на C ++

0

Основываясь на моем понимании, программа C/C++ выглядит примерно так:

Изображение 174551

Я хотел знать следующее:

  1. Могу ли я получить доступ к "текстовой части" текущей программы? При доступе я имею в виду печать начального и конечного адресов и изучение содержимого.
  2. Могу ли я переместить "текстовый раздел" на другой адрес в памяти во время выполнения?

Благодаря,

  • 0
    Если вам нужна конкретная функция, вы можете просто получить прямой доступ к ее указателю для чтения и копирования в другое пространство. Имейте в виду, что обработка кода как данных оказывает огромное влияние на производительность.
  • 0
    Почему именно ты спрашиваешь? Что ты хочешь делать , правда?
Показать ещё 2 комментария
Теги:
memory-management
elf

1 ответ

8

Это конкретная операционная система; Я отвечаю только за 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню