有时候需要将一些图片,音乐或者字符串文件随可执行文件一起打包发布。可以用objcopy命令。
1. 准备资源文件
文件名:strings.txt
内容: well done!
2. 准备C文件
文件名: main.c
内容:
#include <stdio.h>
void main()
{
char *p = "well";
printf("%s\n", p);
}
3. 资源文件打包
objcopy -I binary -O elf64-x86-64 -B i386 strings.txt strings.o
注意: 我pc是64位系统, 不同平台,参数不一样,具体用法请man objcopy
nm strings.o 查看导出符号
000000000000000b D _binary_strings_txt_end
000000000000000b A _binary_strings_txt_size
0000000000000000 D _binary_strings_txt_start
这个导出符号其实是有规律的。
objdump -t strings.o 查看保存在哪个段
SYMBOL TABLE:
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 g .data 0000000000000000 _binary_strings_txt_start
000000000000000b g .data 0000000000000000 _binary_strings_txt_end
000000000000000b g *ABS* 0000000000000000 _binary_strings_txt_size
data段,即是全局变量。
4. 修改main.c文件,
#include <stdio.h>
extern char _binary_strings_txt_start[];
extern char _binary_strings_txt_size[];
void main()
{
char *p = "well";
printf("%s\n", p);
printf("%s\n", _binary_strings_txt_start);
int len = (int)_binary_strings_txt_size;
printf("len=%d\n", len);
}
5. 编译链接
gcc main.c -c
gcc main.o strings.o -o main
6. 运行结果
well
well done!
len=11