В чем разница между файлами ELF и файлами bin?
Конечные изображения, созданные компиляторами, содержат как файл bin, так и файл ELf расширенного загрузчика, в чем разница между ними, особенно утилита файла ELF.
6 ответов
Файл Bin - это чистый двоичный файл без исправлений и перемещений в памяти, более чем вероятно, что он содержит явные инструкции для загрузки по определенному адресу памяти. В то время как....
ELF- файлы имеют исполнимый формат, который можно связать, который состоит из поиска символов и перемещаемой таблицы, то есть он может быть загружен ядром по любому адресу памяти и автоматически, все используемые символы, скорректированы по смещению от того адреса памяти, где он был загружен в. Обычно в файлах ELF есть несколько разделов, таких как "данные", "текст", "bss", если называть только несколько... именно в этих разделах среда выполнения может вычислить, где настроить ссылки на память символа динамически во время выполнения.
Файл bin - это просто биты и байты, которые входят в rom или конкретный адрес, с которого вы будете запускать программу. Вы можете взять эти данные и загрузить их напрямую как есть, вам нужно знать, что такое базовый адрес, хотя обычно его там нет.
Файл elf содержит информацию о бине, но он окружен множеством другой информации, возможной информацией об отладке, символами, которые могут отличить код от данных в двоичном файле. Позволяет использовать более одного фрагмента двоичных данных (когда вы выгружаете один из них в корзину, вы получаете один большой файл с данными заполнения, чтобы заполнить его следующим блоком). Сообщает вам, сколько у вас двоичных файлов и сколько данных bss требуется инициализировать нулями (у инструментов gnu возникают проблемы с правильным созданием файлов bin).
Формат файла elf является стандартом, рука публикует свои улучшения / изменения в стандарте. Я рекомендую всем написать программу разбора эльфов, чтобы понять, что там, не заморачиваться с библиотекой, достаточно просто использовать информацию и структуры в спецификации. Помогает преодолеть проблемы GNU в целом, создавая файлы.bin, а также отлаживая сценарии компоновщика и другие вещи, которые могут помочь испортить ваш вывод bin или elf.
Некоторые ресурсы:
- ELF для архитектуры ARM
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf - ELF из вики
http://en.wikipedia.org/wiki/Executable_and_Linkable_Format
Формат 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]
bin - это последний способ, которым выглядит momery перед тем, как процессор начнет его выполнять. elf - это его сокращенная / сжатая версия, поэтому cpu /mcu не может запускаться напрямую. (динамический) компоновщик сначала должен в достаточной мере отменить это (таким образом, изменить смещения до правильных позиций). но нет компоновщика / os на mcu, поэтому вместо этого вам нужно прошить bin. кроме того, Ахмад Джамал прав. компиляция и компоновка - это отдельные этапы, весь процесс называется сборкой, поэтому коллекция gc имеет отдельные исполняемые файлы, один из которых называется компилятором (который технически выводит сборку), другой называется ассемблером (который выводит объектный код в формате elf), а затем компоновщик (который объединяет несколько объектных файлов в один elf), и, наконец, во время выполнения, динамический компоновщик, который эффективно превращает elf в bin, но только в памяти, для запуска процессора.но обычно весь процесс называют «компиляцией» (как в самом названии gcc), но тогда это вызывает недоумение, когда обсуждаются особенности, такие как этот случай, и Ахмад разъяснял. это обычная проблема из-за неточной природы самого человеческого языка. понижение рейтинга было неуместным.
но чтобы избежать путаницы, gcc выводит объектный код (после внутреннего использования ассемблера) в формате elf. компоновщик просто берет несколько из них (с расширением .o) и дает единый комбинированный результат и, возможно, даже сжимает (в a.out). но все они, даже ".so", являются ELF. это похоже на несколько текстовых документов, каждый из которых оканчивается на «.chapter», и все они объединяются в окончательный «.book», где все файлы технически используют один и тот же стандарт / формат, следовательно, могут иметь расширение «.docx». корзина тогда чем-то похожа на преобразование книги в файл ".txt", при этом добавляется столько пробелов, сколько необходимо, чтобы быть эквивалентным размеру последней книги (напечатанной на одной катушке) с местами для всех изображений, которые должны быть наложенный
Я просто хочу исправить здесь один момент. Файл ELF создается компоновщиком, а не компилятором.
Миссия компилятора заканчивается после создания объектных файлов (*.o) из файлов исходного кода. Компоновщик связывает все файлы.o вместе и создает ELF.
Чистый двоичный код — это последовательность исполняемых кодов операций, которые должны выполняться со смещением 0, ** но не только **.
Чистые двоичные файлы обычно используются в микроконтроллерах, программировании на «голом железе» и начальной загрузке, где нет «laoder», кроме загрузчика ПЗУ.
Чистые двоичные файлы включают в себя .bss и .data, которые из двоичных файлов, которые считываются из флэш-памяти, как в микроконтроллере, должны быть перемещены куда-то в оперативную память. Бинарный файл может включать в себя таблицу векторов, таблицы символов для перемещения «rel» или «rela» (см. -fPIC), таблицу got и так далее. Все эти дополнительные данные получаются в результате бинарного преобразования ELF->, поскольку адреса этих конкретных таблиц получаются из ELF.
Еще одним важным моментом для создания двоичных файлов являются «скрипты компоновщика», они создают смещения разделов и разные адреса, используемые при абсолютных переходах в зависимости от объявленных разделов.
Последнее замечание: чистый двоичный код (.text) также часто перемещается в оперативную память, поскольку внутренняя оперативная память процессора обычно не слишком велика. Для этого в ход идут такие таблицы перемещения.