具有GCC的仅数据静态库

reg*_*fry 1 c resources gcc build ld

如何使用仅包含二进制数据的静态库(没有任何目标代码),并将该数据提供给C程序?这是我正在努力工作的构建过程和简化代码:

./datafile:

abcdefghij
Run Code Online (Sandbox Code Playgroud)

Makefile:

libdatafile.a:
  ar [magic] datafile

main: libdatafile.a
  gcc main.c libdatafile.a -o main
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

我期望从运行中获得的输出main当然是:

abcdefghijabcdefghij
Run Code Online (Sandbox Code Playgroud)

我的问题是:[魔法]和[更神奇]应该是什么?

Sim*_*ter 6

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

objcopy -I binary -O elf32-little data data.o
Run Code Online (Sandbox Code Playgroud)

可以从程序中引用数据

extern char const _binary_data_start[];
extern char const _binary_data_end[];
Run Code Online (Sandbox Code Playgroud)

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

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

  • 值得注意的是:`_binary_`之后的部分是输入二进制文件的名称,而不是常量字符串`data`. (2认同)