Статические библиотеки только для данных с GCC - PullRequest
1 голос
/ 08 марта 2011

Как я могу создать статические библиотеки только с двоичными данными, то есть без любого объектного кода, и сделать эти данные доступными для C-программы?Вот процесс сборки и упрощенный код, который я пытаюсь заставить работать:

./datafile:

abcdefghij

Makefile:

libdatafile.a:
  ar [magic] datafile

main: libdatafile.a
  gcc main.c libdatafile.a -o main

main.c:

#define TEXTPTR [more magic]

int main(){
  char mystring[11];
  memset(mystring, '\0', 11);
  memcpy(TEXTPTR, mystring, 10);

  puts(mystring);
  puts(mystring);
  return 0;
}

Вывод, который я ожидаю получить от запуска main, конечно:

abcdefghijabcdefghij

Мой вопрос: что должно быть [волшебство] и [больше магии]

Ответы [ 2 ]

6 голосов
/ 08 марта 2011

Вы можете преобразовать двоичный файл в файл .o , используя objcopy ; сгенерированный файл затем определяет символы для начального адреса, конечного адреса и размера двоичных данных.

objcopy -I binary -O elf32-little data data.o

На данные можно ссылаться из программы через

extern char const _binary_data_start[];
extern char const _binary_data_end[];

Данные живут между этими двумя указателями (обратите внимание, что объявление их как указателей не работает).

Часть "elf32-little" должна быть адаптирована в соответствии с вашей целевой платформой. Есть много других опций для точного контроля над обработкой.

0 голосов
/ 08 марта 2011

Поместить данные в глобальные переменные.

char const text[] = "abcdefghij";

Не забудьте объявить text в заголовке. Если данные в настоящее время находятся в файле, инструмент FreeBSD file2c может преобразовать их в исходный код C для вас ( manpage ).

...