Остаточні зображення, створені компіляторами, містять як файл bin, так і файл розширеного навантажувача у форматі ELf, у чому різниця між ними, особливо корисність файлу ELF.
Остаточні зображення, створені компіляторами, містять як файл bin, так і файл розширеного навантажувача у форматі ELf, у чому різниця між ними, особливо корисність файлу ELF.
Відповіді:
Файл Bin - це чисто двійковий файл, у якому немає виправлення та переміщення пам'яті, імовірно, він містить чіткі інструкції щодо завантаження за певною адресою пам'яті. Тоді як ....
Файли ELF - це виконуваний прив'язуваний формат, який складається із пошуку символів та переміщуваної таблиці, тобто його можна завантажувати в будь-яку адресу пам'яті ядром і автоматично всі використовувані символи коригувати до зміщення від адреси пам'яті, де він знаходиться було завантажено в. Зазвичай файли ELF мають ряд розділів, таких як "дані", "текст", "bss", щоб назвати лише декілька ... саме в тих розділах, де час виконання може обчислити, де налаштувати посилання на пам'ять символу динамічно під час виконання.
Файл bin - це лише біти та байти, які надходять у rom або на певну адресу, з якої ви будете запускати програму. Ви можете взяти ці дані та завантажити їх безпосередньо як є, вам потрібно знати, яка це базова адреса, хоча, як правило, там немає.
Файл elf містить інформацію про смітник, але він оточений безліччю іншої інформації, можливою інформацією про налагодження, символами, що дозволяє відрізнити код від даних у двійковому файлі. Дозволяє використовувати більше одного фрагмента двійкових даних (коли ви скидаєте один із них у смітник, ви отримуєте один великий файл сміття з даними заповнення, щоб перенести його до наступного блоку). Показує, скільки у вас двійкового файлу і скільки даних bss існує, які хочуть ініціалізувати до нулів (інструменти gnu мають проблеми зі створенням файлів bin правильно).
Формат файлу elf є стандартним, рука видає свої вдосконалення / варіації щодо стандарту. Я рекомендую всім писати програму синтаксичного аналізу elf, щоб зрозуміти, що там, не турбуйтеся про бібліотеку, досить просто використовувати інформацію та структури в специфікації. Допомагає подолати проблеми gnu загалом, створюючи файли .bin, а також налагоджуючи сценарії компонування та інші речі, які можуть допомогти зіпсувати вихідні дані вашого bin або elf.
деякі ресурси:
Формат ELF, як правило, є вихідним результатом компіляції. якщо ви використовуєте ланцюжки інструментів GNU, ви можете перевести його у двійковий формат за допомогою objcopy, наприклад:
arm-elf-objcopy -O binary [elf-input-file] [binary-output-file]
або використовуючи утиліту fromELF (хоча вбудована в більшість IDE, таких як ADS):
fromelf -bin -o [binary-output-file] [elf-input-file]
Я просто хочу виправити тут пункт. Файл ELF створюється Linker, а не компілятором.
Місія компілятора закінчується після створення об'єктних файлів (* .o) з файлів вихідного коду. Linker пов'язує всі файли .o разом і створює ELF.
ld
документації : Зазвичай останнім кроком при складанні програми є запуск ld.
NOP
без-f
(або-fbin
), він компілюється в один байт0x90
, а не в 400 байтний контейнер ELF з-felf32
. Тож лише вихідний код, без метаданих контейнера. NASM заявляє, що він в основному використовується для файлів .COM та .SYS MS-DOS .section
директиви в основному ігноруються і генерують лише вирівнювання.