Які частини виконуваного ELF завантажуються в пам'ять, а де?


10

Що я вже знаю:

Виконавчий файл ELF має ряд розділів, очевидно, що розділи .text і .data завантажуються в пам'ять, оскільки це основні частини програми. Але для того, щоб програма працювала, їй потрібно більше інформації, особливо якщо вона динамічно пов'язана.

Мене цікавлять такі розділи, як .plt, .got, .dynamic, .dynsym, .dynstr etcetera. Частини 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.