Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: abs2bin
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Angel D
Всем, доброго времени суток!!!
Нужно написать программу для конвертирования формата abs(elf) в bin. Может ли кто-нибудь подсказать структуру файла abs, и в общих чертах рассказать алгоритм написания подобной программы. Заранее благодарен.
sigmaN
ну формат нагуглить это не вопрос.
а надо ли велосипед изобретать? есть же готовые утилиты конвертирующие в HEX. Ну а там, где HEX - и до bin не далеко ))
XVR
Для раздраконивания elf есть штатная утилита objdump. Ищите в своем тулчейне (если он на основе gcc)
Angel D
Вижу, что хотя бы кто-то откликнулся… И то хорошо…

Цитата
а надо ли велосипед изобретать? есть же готовые утилиты конвертирующие в HEX. Ну а там, где HEX - и до bin не далеко ))


Изобретать, таки надо… В HEX родной и смотрим, а за одно и одним глазом в документацию по эльфу…

И, вот что я там увидел…

Допустим у нас есть некий тест TEST_1_1.abs (он прикреплён ). Смотрим на него, например, через Total Commander. Анализируя содержимое и, сопоставляя с написанным в доках по эльфу, приходим к таким результатам:

1) Первые 16 байт, это наш заголовок в котором говориться, что это непосредственно эльф-файл, заточен он под 32-бита, data представлена в виде LSB. И ещё там версия заголовка, которая нам, в принципе, до одного места.

Хорошо, смотрим дальше.

2) Два следующих байта говорят нам, что это исполняемый файл.
3) Следящая пара сообщает, что файл предназначен для «такого-то» железа.
4) Далее, целых четыре байта – «очередная» версия.
5) А вот здесь начинают твориться непонятные штуки. Четыре байта адреса, по которому побежит наша система для запуска процесса. Смотрим по этому адресу (0x400) и видим, что там у нас пустота. То есть всё в нопах вплоть до section header table, который находиться в самом конце файла, как будет понятно далее.
6) В следующих четырёх байтах содержится сдвиг от начала файла, по которому у нас лежит program header table (0x34). А следующие четыре байта говорят, где находиться section header table(0x13D0). Тут всё ясно.
7) Потом четвёрка нулевых байтов. Это флаг, который используется в объектниках.
8) Два байта. Это размер заголовка, в котором мы сейчас роемся(0x34).
9) В следующих двух байтах хранится инфа о размере входа в program header table. Причём все остальные энтры такие же.
10) Два байта, которые говорят нам количество файлов program header таблиц.
11) и 12) тоже самое, что и 9) , 10) но для section header table.
13) Последние два байта эта таблица индексов для section name string table.

Насколько я понял из документации, что для того, чтобы нам вытянуть требуемый .bin, то section header table не нужен. А нужен он лишь при линковке. Поэтому туда я даже не заглядывал (лишь краем глаза).

Взялся за program header table. Смотрю по адресу 0x34:
1) Первые четыре байта это тип сегмента. Как видим он у нас равен 1. Это значит, что сегмент загружаемый.
2) Следующая четвёрка показывает, где у нас находиться начало этого сегмента в файле (0xB0).
3) Четыре байта. Это адрес, по которому должен размещаться сегмент в виртуальной памяти(0x00000000).
4) Далее четыре байта. Физический адрес в памяти (0x00000000).
5) Четыре байта. Размер сегмента в файле (0x00000010).
6) Четыре байта. Размер сегмента в памяти(0x00000010).
7) Четыре байта. Флаг. Что он значит, я не нашёл, но он всё равно в нулях.
8) Последняя четвёрка. Выравнивание в памяти и в файле. У нас равно 0х8.
Далее идёт ещё таблица следующего сегмента. Всё тоже самое, только описываются другие адреса и размеры.
Потом идет, судя по всему какой-то string table. А далее собственно сами сегменты.
В итоге, до чего я додумался. Я просто взял эти два сегмента и поместил их в память, так как они идут в самом файле (таблицу секций в конце я откинул).
Но меня терзают смутные сомнения. Всё ли я сделал правильно. И ещё это адрес входа 0х400… К чему он? Проверить пока что не могу, проблемы с платой. Может ещё с таблицей секций чёто делать надо? Или этот непонятный string table тоже куда-то всунуть?

Цитата
Для раздраконивания elf есть штатная утилита objdump.


Не разраконивается... Не разобрался я в ней... Мрачная она какая-то... Но всё равно спасибо...
XVR
Цитата
Не разраконивается... Не разобрался я в ней... Мрачная она какая-то...
Утилита как утилита:
Цитата
[rakhvato@msteplxl41 ~]$ objdump -h TEST_1_1.abs

TEST_1_1.abs: file format elf32-little

Sections:
Idx Name Size VMA LMA File off Algn
0 .test_go 00000010 00000000 00000000 000000b0 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .textTest 000002f8 00040000 00040000 000000c0 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .data_test_res 00000014 000400be 000402f8 000003b8 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .data_dummy 00001000 000400c4 00040310 000003d0 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA

[rakhvato@msteplxl41 ~]$ objcopy TEST_1_1.abs -O ihex qq.hex
Результат (начало qq.hex):
Цитата
:10000000000027C800000400000010D0000010D03D
:020000024000BC
:10000000000080CB000200000000C0CD20000000F6
:10001000000000C600000000000040C60000000014
:10002000000080C6000000000000C0C60000000004
:10003000000000C700000000000040C700000000F2
:10004000000080C7000000000000C0C700000000E2
:10005000000000C200000000000040C200000000DC
:100060000100008000000000000000CC0000000043
:10007000000080CC03000000000030F6000032F6E3
...
:1013000000000000000000000000000000000000DD
:0400000340000000B9
:00000001FF

Angel D
Спасибо… Понял… Всё прекрасно конвертируется… С хексом я разобрался без особых трудностей… Но возникли другие проблемы… Программа в бинарнике не хочет выполняться… Хотя процессор не может хавать что-то другое кроме команд в бинарном виде… Насколько я понял, то файлы в эльфе содержат готовую последовательность команд для процессора. Их только нужно вытянуть оттуда и подсунуть ему. Или нет? Или сами изначальные инструкции для проца кодируются, и только линух умеет их перегонять обратно? Если есть некая таблица кодировки, то может кто-то сказать, откуда её взять?
XVR
Цитата
Насколько я понял, то файлы в эльфе содержат готовую последовательность команд для процессора. Их только нужно вытянуть оттуда и подсунуть ему.
Угу, только в ELF файле еще есть всякие заголовки и вспомогательные секции. Видимо в бинарь (или hex) надо конвертировать не весь файл, а определенные секции. Какие именно - надо смотреть в документации (или скрипте линкера)

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.