Формат двоичных файлов (ARM GCC)

что содержит двоичный файл, который поступает из ARM GCC для устройств ARM?

Есть ли в нем какая-то информация об адресе назначения, на который пишут? Или просто родное, чистое, содержание программы без информации о месте памяти?

Если у меня есть загрузчик или каким-либо образом через программиста, могу ли я записать двоичный файл везде во флэш-памяти или записать сам себя внутренней информацией о конкретном адресе памяти?

Если я настраиваю свой компоновщик-скрипт для записи программы по определенному адресу памяти, влияет ли файл bin?


person MrBit    schedule 18.09.2015    source источник
comment
Взгляните на objdump, чтобы проверить объектные файлы. Обычно существуют таблицы перемещения, таблицы символов и т. Д. Для связывания адресов памяти во время выполнения. У загрузчиков и флеш-программ этого нет, но адреса памяти должны быть правильными! И да, сценарии компоновщика влияют на файл bin, поскольку они определяют, как он должен выглядеть.   -  person Kenney    schedule 18.09.2015
comment
Итак, бинарный файл, описывает и адрес памяти основной программы, который указан в компоновщике-скрипте?   -  person MrBit    schedule 18.09.2015
comment
По сути, все файлы представляют собой двоичные файлы, поскольку они хранятся в битах. Вероятно, вы ищете объектный файл (см. здесь и здесь). Исключение составляют программы на флеш-чипе и загрузчик - они содержат инструкции ЦП и некоторые встроенные данные, но не метаданные. Адреса памяти, которые они используют, определяются оборудованием.   -  person Kenney    schedule 18.09.2015
comment
Я ищу информацию не для объектных файлов, а для двоичных файлов и того, что в них действительно хранится. какая там информация? Могу ли я прошить двоичный файл, который указан (в сценарии компоновщика) с другим адресом основной памяти программы, через загрузчик с тем же адресом памяти?   -  person MrBit    schedule 18.09.2015
comment
Кажется, вы не знаете, что такое двоичные файлы, но уверены, что вам не нужно знать, что такое объектные файлы?   -  person Kenney    schedule 18.09.2015
comment
Да, я уже смотрю на это, но я действительно хочу знать, как связаны двоичный файл и скрипт компоновщика и влияют на программиста или загрузчика, чтобы написать основное приложение по указанному адресу.   -  person MrBit    schedule 18.09.2015
comment
если я использую загрузчик для чтения bin-файла и обновления основного приложения, необходимо указать место в памяти?   -  person MrBit    schedule 18.09.2015
comment
Вам нужно будет быть более конкретным, потому что на ваши вопросы или / или можно эффективно ответить утвердительно. Даже в мире ARM загрузчик может означать что угодно, от горстки кода запуска Cortex-M0 до полноценного UEFI. Загрузчик, который, по сути, представляет собой заглушку кода, связанный с приложением во время сборки, имеет совершенно разные требования по сравнению с загрузчиком, который сам может загружать и запускать стандартные исполняемые файлы ELF или PE / COFF; задайте вопрос о том, что вас интересует.   -  person Notlikethat    schedule 19.09.2015
comment
Я ищу информацию о бинарных файлах, которые генерируются из ARM GCC, о том, что они содержат и как это. Кроме того, как я могу записать двоичный файл во флэш-память устройства ARM через какой-либо загрузчик (например, загрузчик UART) для самостоятельного обновления. и, наконец, как повлиять на выбранный адрес основной программной памяти в сценарии связывания для самообновления (загрузчик записывает прошивку по определенному постоянному адресу, поэтому я не понимаю влияние сценария связи на основной адрес программы).   -  person MrBit    schedule 19.09.2015
comment
GCC испускает объекты ELF (иногда PE / COFF или другие форматы объектов для определенных целей, но в основном ELF). Конкретный двоичный формат, который ожидает конкретный загрузчик, во многом зависит от этого загрузчика: просто ли он начинает выполнение кода на месте во флэш-памяти? Выполняется ли сначала какой-нибудь переезд? Ищет ли он какой-то заголовок / контрольную сумму / и т. Д.? Что вы делаете для конкретного устройства полностью зависит от поведения загрузчика, периферийных устройств и структуры памяти этого устройства; замените ARM на MIPS, PowerPC, AVR или что-нибудь еще, и это все тот же вопрос.   -  person Notlikethat    schedule 19.09.2015
comment
Таким образом, двоичные файлы могут содержать, кроме основной прошивки, заголовка, контрольной суммы, перемещений памяти ...   -  person MrBit    schedule 19.09.2015
comment
Как я могу увидеть структуру имеющегося у меня двоичного файла? я имею в виду, если в нем есть заголовок подписи или магическое число, как я могу это узнать и найти?   -  person MrBit    schedule 19.09.2015
comment
См. Книгу Дэвида Саломона Ассемблеры, компоновщики и загрузчики. Вам необходимо настроить среду «C» со стеком, очистить «BSS» и скопировать данные инициализации из флэш-памяти в ОЗУ для загрузчика и т. Д .; обычно начальная загрузка написана на ассемблере. Компилятор / ассемблер может относиться к ПК (и относиться к данным) или может быть абсолютным. Флаги компилятора, конкретный ассемблер и т. Д. Будут определяться на основе конструкции двоичного кода. Двоичные файлы могут быть чем угодно. Есть инструмент binwalk (и, возможно, другие) для анализа, но они могут давать ложные срабатывания.   -  person artless noise    schedule 19.09.2015
comment
Типичный загрузчик обрабатывает двоичный файл, который является отдельной программой в исполняемом файле образа. Некоторые загрузчики ARM (например, для Atmel ARM9) полагаются на изображение, содержащее вектор исключения ARM в первых 28 байтах изображения. Изображение обычно связывается для загрузки и выполнения по определенному адресу памяти (если программа не была закодирована так, чтобы ее можно было перемещать на 100%, что бывает редко).   -  person sawdust    schedule 24.09.2015


Ответы (1)


Есть несколько типов файлов, которые называются бинарными (по крайней мере, среди моих коллег):

.bin расширение файла. Содержит только данные, которые могут быть записаны в один непрерывный раздел. Он не содержит внутри адресов или смещений. При прошивке этого файла на микроконтроллер вы должны явно указать адрес назначения (часто это 0x0, начало флеш-памяти). Если вам нужно писать в разные разделы, вам нужен отдельный .bin для каждого из них (или его можно объединить, если эти разделы идут подряд). Таким образом, этот тип файла похож на объем памяти.
Плюсы: минимальные накладные расходы, если у вас один непрерывный раздел, и адрес назначения всегда один и тот же (поэтому его можно жестко запрограммировать)

.hex - это файл в формате Intel hex. Он содержит адрес назначения для каждой строки. Открывается в любом текстовом редакторе.

.s19 или .srec Motorola s-record. Очень похоже на .hex, только в другом формате. Также может включать некоторые метаданные, которые не будут мигать.

Плюсы двух последних типов: лучший выбор, если у вас несколько несовместимых разделов. Можно сжать, удалив зазоры

Для VSCode есть несколько плагинов, которые могут выделять файлы .s19 и .hex.

person Dmitriy I    schedule 30.04.2021