具有GCC的仅数据静态库

时间:2011-03-08 16:05:10

标签: c gcc resources build ld

如何使用仅包含二进制数据的静态库,即没有任何目标代码,并将该数据提供给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 个答案:

答案 0 :(得分:6)

您可以使用objcopy将二进制文件转换为 .o 文件;然后,生成的文件定义起始地址,结束地址和二进制数据大小的符号。

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

可以通过

从程序中引用数据
extern char const _binary_data_start[];
extern char const _binary_data_end[];

数据存在于这两个指针之间(请注意,将它们声明为指针不起作用)。

“elf32-little”部分需要根据您的目标平台进行调整。还有许多其他选项可以精确控制处理。

答案 1 :(得分:0)

将数据放入全局变量中。

char const text[] = "abcdefghij";

不要忘记在标题中声明text。如果数据当前在文件中,FreeBSD file2c工具可以将它转换为C源代码(manpage)。