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

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

Структура памяти программ на Си. Источник: Интернет

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

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

Спасибо,

0

Решение

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

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]