Как создать объектный файл с большим двоичным массивом char [] в Linux? - PullRequest
1 голос
/ 30 июля 2011

Мне нужен инструмент, эквивалентный:

$ echo 'char bar[] = {65, 66, 67};' >foo.c
$ gcc -c foo.c

У меня есть бинарный файл размером в несколько мегабайт, который нужно поместить в массив bar, и он мне нужен без создания файла .c:Я бы хотел, чтобы файл .o создавался прямо из двоичного файла.Другим вариантом может быть создание файлов .s или .S, но я бы тоже хотел этого избежать.Есть ли в binutils и т. Д. Инструмент, способный выполнить эту работу?

Обновление: gcc segfaults для двоичного файла объемом 9 МБ.as работает, но работает медленно и временный файл .s слишком велик.

Ответы [ 2 ]

1 голос
/ 31 июля 2011

Вы можете использовать objcopy --add-section для создания раздела с содержимым, найденным в файле. Я думаю, что вам нужно использовать скрипт компоновщика, чтобы добавить символ, указывающий на начало нового раздела.

0 голосов
/ 10 сентября 2013

Долгое время самым простым решением было создание файла .s или .S.

binutils не содержит ничего полезного.

Тамэто двухэтапный трюк, который быстр и использует мало памяти:

Шаг 1. Создайте и скомпилируйте файл .c, который содержит символ правильного размера, но у него короткая подпись вместо реальнойДлинные данные.Он должен выглядеть следующим образом:

const char hi[1234567] = "SIGNATURE";
const char *hi_end = hi + sizeof(hi) / sizeof(char);

Шаг 2. Найдите байты SIGNATURE в файле .o, сгенерированном компилятором, и замените его (и следующие '\0' s) данными изфайл реальных двоичных данных.

Скрипт Perl cobjgen автоматизирует оба этапа.См. сообщение в блоге для более подробного анализа и использования.

...