Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PR_СП_лекции_укр.doc
Скачиваний:
6
Добавлен:
22.04.2019
Размер:
697.34 Кб
Скачать

1.3 Формати об'єктних файлів

Об'єктні файли мають особливу конструкцію і є планом роботи, спец, що містить. символи із зіставленими ним адресами і значеннями.

Об'єктні файли розташовані на диску і складаються з декількох секцій:

  • заголовки (HEADER) - містять інформацію для завантажувача

  • текстові сегмент (TEXT SEGMENT) - містить захищені коди програм

  • сегменти даних (DATA SEGMENT) - містить ініціалізовані дані. Ці дані можуть бути модифіковані програмою, але простір, що відводиться під них, завжди залишається незмінним.

  • символьна таблиця (SYMBOL TABLE) - містить посилання на всі використовувані в програмі символи (літерали). Тут поміщається інформація про всю форматовану інформацію.

  • налагоджувальна таблиця (DEBAG TABLE), якщо при запуску програми використовуються налагоджувальні опції. Ця таблиця містить інформацію по відладці програм при застосуванні стандартних відладчиків і копія її є на диску.

Завантажувач завантажує виконуваний файл з диска у відведену йому пам'ять і створює образ процесу. Між виконуваним файлом і образом однозначної відповідності немає.

Образ містить три зони:

  • сегмент коди – текст машинних команд. Він не змінюється ні в розмірах, ні в змісті і дозволений тільки для читання.

  • сегмент даних - містить змінні, рядки, масиви і інші дані програми. Він складається з двох частин

  • дані, що ініціалізували, - змінні і константи, значення яких відомі при запуску програми

  • BSS(Bulk Storage System) – пристрій великої ємкості, що запам'ятовує) може збільшуватися під час виконання процесу, містить неініціалізовані дані застосування, включаючи всі змінні, що декларують як статичні у всіх функціях або модулях (більшість глобальних змінних не ініціалізувалися).

  • може модифікуватися. Більш того, програма може зажадати виділення додатковій пам'яті динамічно, під час виконання.

  • стік - містить змінні оточення (оболонки), а також командний рядок, введений при виклику цієї програми

Розмір, вміст і розташування сегментів в пам'яті визначається як самою програмою (наприклад, використанням бібліотек, розміром коди і даних), так і форматом виконуваного файлу цієї програми (COFF, ELF)

У UNIX існує три домінуючі формати виконуваних файлів:

  1. а.out

  2. COFF

  3. ELF

а.out

Assembler Output

Старий і ``классический'' об'єктний формат UNIX. Він використовує короткий і компактний заголовок з магічним числом на початку, яке часто використовується для опису формату. Він містить три завантажувані сегменти: .text, .data і .bss плюс таблицю символів і таблицю рядків.

Образ підтримує тільки три стандартні секції .text, .data і .bss.

COFF

Загальний формат об'єктних файлів

Об'єктний файл формату COFF складається із заголовка файлу, заголовка системи UNIX, таблиці заголовків секцій, секцій даних, настроювальної інформації, номерів рядків (необов'язково), і таблиці символів.

Заголовок файлу

заголовок системи UNIX

заголовок секції (1..n)

дані секції (1..n)

настройка секції (1..n)

номери рядків секції (1..n)

таблиця символів

таблиця рядків

Малюнок 1.4 - Структура файлу формату COFF

Заголовок файлу містить кількість секцій, тимчасові відмітки, покажчик на таблицю символів і іншу інформацію.

Заголовок системи UNIX містить системний код файлу (за умовчанням вісімкове 410 для тексту, що розділяється, або 407 для суміщених тексту і даних), розмір тексту, розмір даних, що ініціалізували, розмір неініціалізованих даних, точку входу, базові адреси тексту і даних.

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

Зауваження: Секція .bss має розмір і символи, які посилаються на неї. Але в ній немає ні покажчиків на точку переміщення, ні номерів рядків, ні даних. Тому секція .bss має запис в таблиці заголовків секцій, але більше не займає місця ніде в COFF-файле.

Далі слідують секції початкових даних, що складаються з відповідної кількості байт тексту або даних. Файли, створені cc і as завжди містять три секції: .text (виконуваний код), .data (змінні, що ініціалізували) і .bss (неініціалізовані змінні).

Останні чотири складові формату COFF (настройка, номери рядків, таблиця символів і таблиця рядків) можуть бути відсутніми, якщо програма була зібрана з опцією -s редактора зв'язку або якщо таблиця символів і біти настройки були видалені за допомогою команди strip(1). Якщо не залишилося недозволених посилань після компоновки програми, буде відсутня настроювальна інформація.

Секція номерів рядків додається до об'єктного файлу тільки при компіляції з опцією -g, для подальшого використання sdb(1).

Кожен вхід в таблиці символів містить або ім'я символу, якщо воно не більше 8 знаків, або зсув в таблиці рядків, де зберігається рядок імені, а також значення символу, тип, клас пам'яті і іншу інформацію. Команда nm(1) показує таблицю символів об'єктних файлів.

Таблиця рядків створюється тільки при необхідності. Тут суцільним масивом зберігаються імена символів довше за вісім знаків, що кожне завершується нульовим байтом.

При завантаженні виконуваного файлу відбувається виділення віртуальній пам'яті, яка розподіляється таким чином

Малюнок 1.5 - Базова структура пам'яті для процесів, що завантажуються з файлу формату COFF

Весь файл від початку до кінця завантажується в єдиний сегмент, званий "code" або "text".

Heap область - це область пам'яті, що динамічно розподіляється додатком, причому само застосування має можливість управляти зростанням сегменту даних, виділяючи додаткову пам'ять з цієї ж heap області.

Якщо частини (стік і BSS), що ростуть, зійшлися, відбувається апаратне переривання, при якому додається одна сторінка.

Elf (Executable and Linkable Format)

формат виконуваних і бібліотечних файлів

Найбільш популярний зараз формат. Крім банального створення виконуваних файлів програм і бібліотек, ELF полегшує формування і функціонування складних файлових комплексів, відладку програм.

Спадкоємець формату COFF, що підтримує множинні сегменти і 32-бітові або 64-бітові значення.

Об'єктні файли мають таблицю заголовків секцій, виконувані - таблицю програмних заголовків, а бібліотеки - і те і інше.

Форма ELF'a описана у файлі /usr/include/elf.h.

У загальному випадку, формат файлу виглядає таким чином:

ELF заголовок

<- настройки для завантажувача

Програмний заголовок (1..n)

Секційний заголовок (1..n)

дані

<- виконуваний код і дані

Дані

............... n

...............

Дані

Таблиця заголовків сегментів

Малюнок 1.6 - Структура файлу формату ELF (це сам файл)

ELF заголовок потрібний для того, щоб дати зрозуміти завантажувачу для якої версії Unix призначена програма, для якого процесора і якої архітектури. У заголовку заданий розмір програми, скільки виділити для програми пам'яті, точка входу в програму і інша супутня інформація.

Один або декілька програмних заголовків указують завантажувачу які частини файлу повинні бути завантажені і в які адреси пам'яті, а також указують на права доступу до цих блоків в пам'яті.

Секційні заголовки - це вказівки для завантажувача з інформацією про

  • типі секції і дії ОС з даною секцією

  • розташуванні секції у файлі

  • стартова адреса секції у віртуальній пам'яті процесу

  • розмір секції у файлі

  • розмір секції в пам'яті

  • прапори доступу

Таблиця заголовків сегментів визначають розділи файлу, використовувані для пов'язання з іншими модулями і містять всю необхідну інформацію для опису цих розділів.

Приблизно так виглядає образ запущеної програми ELF в пам'яті.

Малюнок 1.7 - Базова структура пам'яті для процесів, що завантажуються з файлу формату ELF (це виділена під процес пам'ять)

Динамічний сегмент це сегмент службових даних про підвантажувані бібліотеки під час запуску програми.

[це коли частина процесу динамічною линковки бібліотек відбувається не у момент запуску виконуваного файлу, а проводиться один раз до самого запуску. Кожній бібліотеці, що бере участь в процесі, відводиться фіксований віртуальний адресний простір, виходячи з цих адрес розраховуються relocations, інформація зберігається в додаткових секціях ELF. Має обмеження на кількість бібліотек (зважаючи на обмеження адрес)]

Якщо компіляція пройшла вдало і вийшов об'єктний файл, ми маємо можливість вивчити його. Найбільш популярними при вивченні об'єктних файлів, є наступні:

  • nm: Виводить перелік символів об'єктного файлу.

  • objdump: Виводить докладну інформацію, що міститься в об'єктних файлах.

  • readelf: Виводить інформацію про об'єктні файли ELF.

nm

Виводить перелік символів об'єктного файлу, а також їх типів і значень. Якщо ви введете команду nm, ви відмітите, що за умовчанням вона шукає файл з назвою а.out Якщо такого файлу немає, утиліта виразить свою незадоволеність. якщо інструмент знаходить файл а.out, створений компілятором, він виводить лістинг, подібний

08049594 A __bss_start

080482e4 t call_gmon_start

08049594 b completed.4463

08049498 d __CTOR_END__

08049494 d __CTOR_LIST__

08049588 D __data_start

08049588 W data_start

0804842c t __do_global_ctors_aux

0804830c t __do_global_dtors_aux

0804958c D __dso_handle

080494a0 d __DTOR_END__

0804949c d __DTOR_LIST__

Перед кожним символом, виведеним командою nm, указується відповідне йому значення в шістнадцятиричному (за умовчанням) форматі, а також символьний код, відповідний типу символу. Деякі найбільш поширені коди: A (абсолютне значення) - значення, які не змінюватимуться при подальшому линковании; B – символи з розділу BSS; C – загальні символи, вказуючі на неініціалізовані дані.

Objdump (objdump -d а.out)

Для докладнішого вивчення вмісту об'єктного файлу (зокрема тип), для чого видає асемблерний лістинг кожного з розділів об'єктного файлу, що містить виконуваний код.

Для програми "Hello World"

а.out: file format elf32-i386

Disassembly of section .init:

08048278 <_init>:

8048278: 55 push %ebp

8048279: 89 e5 mov %esp,%ebp

804827b: 83 ec 08 sub $0x8,%esp

804827e: e8 61 00 00 00 call 80482e4 <call_gmon_start>

8048283: e8 b3 00 00 00 call 804833b <frame_dummy>

8048288: e8 9f 01 00 00 call 804842c <__do_global_ctors_aux>

804828d: c9 leave

804828e: c3 ret

Disassembly of section .plt:

08048290 <puts@plt-0x10>:

8048290: ff 35 78 95 04 08 pushl 0x8049578

8048296: ff 25 7c 95 04 08 jmp *0x804957c

804829c: 00 00 add %al,(%eax)

...

080482a0 <puts@plt>:

80482a0: ff 25 80 95 04 08 jmp *0x8049580

80482a6: 68 00 00 00 00 push $0x0

80482ab: e9 e0 ff ff ff jmp 8048290 <_init+0x18>

080482b0 <__libc_start_main@plt>:

80482b0: ff 25 84 95 04 08 jmp *0x8049584

80482b6: 68 08 00 00 00 push $0x8

80482bb: e9 d0 ff ff ff jmp 8048290 <_init+0x18>

Disassembly of section .text:

080482c0 <_start>:

80482c0: 31 ed xor %ebp,%ebp

80482c2: 5e pop %esi

80482c3: 89 e1 mov %esp,%ecx

80482c5: 83 e4 f0 and $0xfffffff0,%esp

80482c8: 50 push %eax

80482c9: 54 push %esp

80482ca: 52 push %edx

80482cb: 68 e1 83 04 08 push $0x80483e1

80482d0: 68 90 83 04 08 push $0x8048390

80482d5: 51 push %ecx

80482d6: 56 push %esi

80482d7: 68 60 83 04 08 push $0x8048360

80482dc: e8 cf ff ff ff call 80482b0 <__libc_start_main@plt>

80482e1: f4 hlt

80482e2: 90 nop

80482e3: 90 nop

І так далі

Readelf (readelf -all а.out)

також може вивести вміст об'єктного файлу з подібною ж прозорістю. Має іншу структуру. Наприклад, в заголовку ELF представлена коротка інформація про всі розділи файлу. Ця інформація може бути корисна при вивченні великих об'єктних файлів.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]