2013-05-31 2 views
2

У меня есть проект, требующий кучу графических файлов в исполняемом файле. Поскольку в объекте нет файловой системы, я не могу использовать функцию fopen. Один из способов преобразования содержимого файла в исходный код C, который содержит определение переменной, как этотКак добавить двоичные ресурсы

unsigned char file1_content[] = { 
    0x01, 0x02, ... 
}; 

Это громоздко строить такие файлы, даже с помощью инструмента преобразования.

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

ответ

2

Это не особенно громоздко с помощью инструмента, и это классическое решение. Search for "bin2c", чтобы найти некоторые.

Вам просто нужно включить эти шаги создания активов в процесс сборки, то есть вызвать инструмент из Makefile. Это также означает, что инструмент запускается только при изменении исходных данных, что приятно.

По крайней мере GNU компоновщик (LD), кажется, способен размещая файлы в разделах выходного файла (см Section Placement documentation, например, так:

.data : { afile.o bfile.o cfile.o } 

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

Я бы рекомендовал перейти к подходу bin2c.

1

Вы можете использовать опцию компоновщика --format вместе с -Wl, передать его линкера, как:

gcc -Wl,--format=binary -Wl,myfile.bin -Wl,--format=default 

Последний формат настройки по умолчанию позволяет переключаться линкер обратно в стандартный формат ввода.

Вы можете получить доступ к двоичным ресурсам из источников с помощью простого _binary_myfile_bin_start символа ассемблера (для myfile.bin, для xxx.yyy будет _binary_xxx_yyy_start и _binary_xxx_yyy_end) как:

И следующее использование data. Это намного лучше, чем делать objcopy самостоятельно или использовать хакерство ресурсов.

UPD: Расширение с небольшим примером - главные выходы первые четыре байта своего собственного объектом файла:

#include "stdio.h" 
#include "stdint.h" 

extern uint8_t data[] asm("_binary_main_o_start"); 

int 
main(void) 
{ 
    fprintf(stdout, "0x%x, 0x%x, 0x%x, 0x%x\n", data[0], data[1], data[2], data[3]); 
    return 0; 
} 

Теперь компилировать пробег:

$ gcc -o main.o -c main.c 
$ gcc -o main main.o -Wl,--format=binary -Wl,main.o -Wl,--format=default 
$ ./main 
0x7f, 0x45, 0x4c, 0x46 
+0

Как я получаю символ xxx_end или размер двоичного файла? – harper

+0

Конец данных помечен компоновщиком как '' _binary_xxx_yyy_end'', а размер отмечен как '' _binary_xxx_yyy_size'' –

+0

Могу ли я создать библиотеку (.ar), которая содержит элементы, созданные из двоичных файлов? Наконец, я хотел бы связать эту библиотеку двоичных файлов. – harper

Смежные вопросы