Ответ 1
Есть несколько возможностей:
-
использовать ld возможность превратить любой файл в объект (Встраивание двоичных blobs с использованием gcc mingw):
ld -r -b binary -o binary.o foo.bar # then link in binary.o
-
используйте утилиту
bin2c
/bin2h
, чтобы превратить любой файл в массив байтов (Вставить изображение в код без использования раздела ресурсов или внешних изображений)
Обновление: здесь более полный пример использования данных, связанных с исполняемым файлом с помощью ld -r -b binary
:
#include <stdio.h>
// a file named foo.bar with some example text is 'imported' into
// an object file using the following command:
//
// ld -r -b binary -o foo.bar.o foo.bar
//
// That creates an bject file named "foo.bar.o" with the following
// symbols:
//
// _binary_foo_bar_start
// _binary_foo_bar_end
// _binary_foo_bar_size
//
// Note that the symbols are addresses (so for example, to get the
// size value, you have to get the address of the _binary_foo_bar_size
// symbol).
//
// In my example, foo.bar is a simple text file, and this program will
// dump the contents of that file which has been linked in by specifying
// foo.bar.o as an object file input to the linker when the progrma is built
extern char _binary_foo_bar_start[];
extern char _binary_foo_bar_end[];
int main(void)
{
printf( "address of start: %p\n", &_binary_foo_bar_start);
printf( "address of end: %p\n", &_binary_foo_bar_end);
for (char* p = _binary_foo_bar_start; p != _binary_foo_bar_end; ++p) {
putchar( *p);
}
return 0;
}
Обновление 2 - Получение размера ресурса: я не смог правильно прочитать _binary_foo_bar_size. Во время выполнения gdb показывает правильный размер текстового ресурса с помощью display (unsigned int)&_binary_foo_bar_size
. Но присвоение этого переменной всегда давало неверное значение. Я мог бы решить эту проблему следующим образом:
unsigned int iSize = (unsigned int)(&_binary_foo_bar_end - &_binary_foo_bar_start)
Это обходной путь, но он работает хорошо и не слишком уродлив.