Какие части исполняемого файла ELF загружаются в память и где?

10

Что я уже знаю:

Исполняемый файл ELF имеет несколько разделов, очевидно, что секции .text и .data загружаются в память, поскольку они являются основными частями программы. Но чтобы программа работала, ей нужно больше информации, особенно когда она динамически связана.

Меня интересуют такие разделы, как .plt, .got, .dynamic, .dynsym, .dynstr и так далее. Части ELF, которые отвечают за связывание функций с адресами.

Из того, что мне удалось выяснить до сих пор, является то, что такие вещи, как .symtab и .strtab не загружаются (или не остаются) в памяти. Но используются ли .dynsym и .dynstr компоновщиком? Они остаются в памяти? Могу ли я получить к ним доступ из кода программы?

И есть ли части исполняемого файла, которые находятся в памяти ядра?

Мой интерес к этому в основном судебно-медицинский, но любая информация по этой теме поможет. Ресурсы, которые я читал об этих таблицах и динамических связях, более высокого уровня, они только объясняют работу, а не что-либо практическое в отношении содержимого в памяти.

Дайте мне знать, если что-то неясно по моему вопросу.

Княжества
источник

Ответы:

12

Следующее - действительно хорошая ссылка: http://www.ibm.com/developerworks/linux/library/l-dynamic-libraries/ . Он содержит библиографию в конце различных ссылок на разных уровнях. Если вы хотите узнать все подробности, вы можете перейти прямо к источнику: http://www.akkadia.org/drepper/dsohowto.pdf . (Ульрих Дреппер написал динамический компоновщик Linux.)

Вы можете получить действительно хороший обзор всех разделов вашего исполняемого файла, выполнив команду типа "objdump -h myexe" или "readelf -S myexe".

Раздел .interp содержит имя динамического загрузчика, который будет использоваться для динамического связывания символов в этом объекте. Раздел .dynamic представляет собой дистрибутив заголовка программы, отформатированный так, чтобы его можно было легко прочитать динамическому загрузчику. (Так что он имеет указатели на все остальные разделы.)

.Got (глобальная таблица смещений) и .plt (таблица связывания процедур) - это две основные структуры, которыми управляет динамический компоновщик. .Got - это таблица косвенности для переменных, а .plt - таблица косвенности для функций. Каждый исполняемый файл или библиотека (которые называются «общими объектами») имеет свои собственные .got и .plt, и это таблицы символов, на которые ссылается этот общий объект, которые фактически содержатся в каком-либо другом общем объекте.

.Dynsyn содержит всю информацию о символах в вашем общем объекте (как те, которые вы определяете, так и внешние, на которые вы должны ссылаться). .Dynsyn не содержит реальных имен символов. Они содержатся в .dynstr, а .dynsyn имеет указатели на .dynstr. .gnu.hash - это хеш-таблица, используемая для быстрого поиска символов по имени. Он также содержит только указатели (указатели на .dynstr и указатели, используемые для создания цепочек блоков).

Когда ваш общий объект разыменовывает какой-либо символ «foo», динамический компоновщик должен искать «foo» во всех динамических объектах, с которыми вы связаны, чтобы выяснить, какой из них содержит «foo», который вы ищете (и затем, что относительно адрес «foo» находится внутри этого общего объекта.) Динамический компоновщик делает это путем поиска в разделе .gnu.hash всех связанных общих объектов (или в разделе .hash для поиска старых общих объектов, у которых нет .gnu. раздел хеш.) Как только он находит правильный адрес в связанном общем объекте, он помещает его в .got или .plt вашего общего объекта.

Блуждающая логика
источник
Спасибо, ваши ссылки делают меня на шаг вперед в поиске виртуальных сопоставлений нужных мне разделов. Поскольку мой интерес к этому является судебно-медицинским, «загруженный в DRAM» по-прежнему актуален для меня. Если раздел сопоставлен, но не загружен, я не смогу найти его в дампе памяти :)
Dutchy
Ты прав. Когда вы сделаете дамп памяти, вы получите копию каждой отображенной страницы, поэтому мое различие между «сопоставлен в vm» и «загружен в DRAM» не имеет значения. Я удалил это предложение, и ответ улучшился. Спасибо!
Блуждающая логика
Ваш ответ помечен как ответ, потому что это столько информации, сколько я собираюсь получить :) Остальное придется делать самому, в конце концов, это мое исследование.
Датч
Итак, да .dynsym и и .dynstr (и другие) используются динамическим компоновщиком и загружаются в память программы (в текстовом сегменте) и могут использоваться вашей программой во время выполнения.
ysdx