Извлечение разделов данных только для чтения из архива / lib (ELF я предполагаю?) Для сжатия - PullRequest
0 голосов
/ 25 января 2019

UPDATE: Таким образом, вопрос заключается в следующем: моя установка сборки создает архив / lib (двоичный вывод), из которого я хотел бы извлечь некоторые данные для сжатия в моем случае, но на самом деле это не главное.

Мои инстинкты говорят мне, что, поскольку компоновщик может извлекать постоянные данные из архива / lib, для меня должно быть возможным / легко "сбросить" двоичное "содержимое" символа, содержащегося в архиве / lib, например, в. файл ....

Итак, это мой вопрос: как вывести двоичное содержимое символа в архив / lib (в формате ELF)?

UPDATE: Я создаю приложение на основе lvgl . Для разрешения текстов я использую онлайн-инструмент, предоставляемый сопровождающим lvgl, для преобразования шрифтов TrueType в C-код (данные const), который связан с приложением для рендеринга текстов. Но результирующий набор данных для шрифтов становится слишком большим для моей доступной флэш-памяти, но у меня большой кусок неиспользуемой оперативной памяти. Итак, я хотел бы использовать heatshrink для сжатия данных и распаковки в оперативную память во время выполнения.

Для этого требуется, чтобы моя установка сборки могла извлекать двоичные данные, сжимать их и связывать с флэш-памятью, чтобы мой код времени выполнения мог распаковывать их.

Я догадывался, что могу скомпоновать все сгенерированные данные шрифта в "lib", извлечь двоичные данные, сжать их и связать в приложение как "BLOB-объект".

Но мне не удается извлечь данные для сжатия из библиотеки

например. моя декларация шрифта выглядит следующим образом:

/*Store the image of the letters (glyph)*/
static const uint8_t _glyph_bitmap[] = 
{ /* const Byte values follow (e.g. 0x00) */ };

static const lv_font_glyph_dsc_t _glyph_dsc[] = 
{ /* struct initialization follows */ }

lv_font_t myfont
{ /* struct initialization follows */ }

Так что мне нужно было бы получить доступ к myfont и объявлениям, на которые он ссылается, в двоичном виде.

У меня есть инструмент, который создает c-код, представляющий некоторые двоичные данные, чтобы позволить данным быть скомпилированными и связанными в конечный исполняемый файл (платформа ARM, набор инструментов GNU, пользовательское оборудование). У меня заканчивается флэш-память, но у меня есть запасная память. Поэтому я рассматриваю сжатие некоторых больших разделов с постоянными данными в библиотеке и распаковываю их в оперативную память по мере необходимости. Так что я могу скомпилировать c-код и поместить его в архив. Но до сих пор мне не повезло, когда я пытался извлечь двоичные данные из константных данных для сжатия, например. objdump или objcopy. Но что-то говорит мне, что это возможно (а может быть, даже легко). Но как? Я пытался "погуглить" проблему, но пришел с пустыми руками.

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Эврика!Я понял это!

Хотя я полностью признаю и ценю совет, данный в комментариях / других ответах, меня все еще беспокоило, что я предположил, что относительно легко "воспроизвести компоновщик" и извлечь двоичные объектыжестко закодированных данных, например, из объектного файла.

Ну, это оказывается относительно легко (в любом случае для объектов формата эльф), как и ожидалось, используя readelf

Чтобы сбросить символ, я использовал два шага:

  1. Вычислить индекс символа, посмотрев на символы в объекте:

    $ readelf --syms company_logo.o

    Symbol table '.symtab' contains 17 entries:

    Num: Value Size Type Bind Vis Ndx Name

    0: 00000000 0 NOTYPE LOCAL DEFAULT UND

    1: 00000000 0 FILE LOCAL DEFAULT ABS company_logo.c

    2: 00000000 0 SECTION LOCAL DEFAULT 1

    3: 00000000 0 SECTION LOCAL DEFAULT 2

    4: 00000000 0 SECTION LOCAL DEFAULT 3

    5: 00000000 0 SECTION LOCAL DEFAULT 4

    6: 00000000 0 NOTYPE LOCAL DEFAULT 4 $d

    7: 00000000 0 SECTION LOCAL DEFAULT 6

    8: 00000000 0 SECTION LOCAL DEFAULT 7

    9: 00000000 0 SECTION LOCAL DEFAULT 9

    10: 00000000 0 SECTION LOCAL DEFAULT 10

    11: 00000000 0 SECTION LOCAL DEFAULT 12

    12: 00000000 0 SECTION LOCAL DEFAULT 13

    13: 00000000 0 SECTION LOCAL DEFAULT 14

    14: 00000000 0 SECTION LOCAL DEFAULT 15

    15: 00000000 12 OBJECT GLOBAL DEFAULT 4 company_logo

    16: 00000000 21879 OBJECT GLOBAL DEFAULT 6 company_logo_map

  2. Дамп содержимого символовl.

Теперь моя цель была company_logo_map, поэтому используйте ее индекс 6, как показано ниже:

`readelf --hex-dump=6 company_logo.o`

` `

`Hex dump of section '.rodata.company_logo_map':`

`  0x00000000 00000000 00000000 00000000 00000000 ................`

`  0x00000010 00000000 00000000 00000000 00000000 ................`

`  0x00000020 00000000 00000000 00000000 00000000 ................`

`  0x00000030 00000000 00000000 00000000 00000000 ................`

`  ... lots more data here`
0 голосов
/ 07 июня 2019

Вместо того, чтобы извлекать данные из скомпилированного двоичного файла, почему бы не извлечь их из сгенерированного кода C, сжать его и сгенерировать эквивалентный код C со сжатыми данными?

Этот подход, вероятно, упростит многие аспекты реализации, отладка и тестирование.

...