Add external data to c program | 在C程序中添加其他数据(普通二进制、图片、MP3 等)到data段

使用以下命令准备需要加入到程序.rodata段的原始文件

1
2
3
4
5
1.需要注意程序的输出格式和运行的在什么架构的CPU上也就是-O参数和-B参数
objcopy -I binary -O elf64-x86-64 -B i386:x86-64 fs_output.bin golden_bin.o
2.然后查看生成的符号表
objdump -ht golden_bin.o
3.然后在程序中引用时就使用的对应的符号

如何使用数据

在代码中引用数据

1
2
3
4
5
6
7
8
9
10
extern const unsigned long _binary_fs_output_bin_start;
extern const unsigned long _binary_fs_output_bin_end;

int data_ref()
{
int ret = 0;
struct bin_fs *f_info = (struct bin_fs *) &_binary_fs_output_bin_start;
printf("type %d path %s size:%d\n", f_info->f_type, f_info->f_path, f_info->f_size);
return ret;
}

如何将golden_bin.o编译进入程序

直接编译

1
2
3
4
5
使用命令
1. gcc src/main.c src/gen_bin_fs.c golden_bin.o -W -o a
或者
2. gcc src/main.c src/gen_bin_fs.c golden_bin.o -z noexecstack -W -o a

在链接脚本中新增一个节点来引用

1.导出程序默认的链接脚本

1
ld --verbose > link.lds

2.注意需要删除link.lds中分割线前的内容以及分割线
3.在link.lds中添加引用golden_bin.o的节点

1
2
3
4
5
6
.golden_bin_region :
{
__golden_bin_start = .;
KEEP(/home/jack/work/fs_tools/golden_bin.o)
__golden_bin_end = .;
}

4.使用以下命令进行编译

1
gcc src/main.c src/gen_bin_fs.c  -T src/link.lds -z noexecstack -W  -o a