C语言项目将外部数据文件打包进elf文件的解决方案

        最近遇到一个项目需求,需要将一个数据文件打包进elf可执行程序中,原因是这个elf可执行程序需要在CPU裸机上跑,且没有文件系统支持。

需要打包的数据文件为:matrix.dat

C语言项目只有一个源程序文件:main.c

首先,在main.c中定义一个变量,且指定其section,如下:

// 自定义section
char MatrixData __attribute__((section(".MatrixData")));

void main()
{
    // 获取section起始地址,即打包入elf的数据块起始地址
    void * pMatrixData = &MatrixData;
}

然后,使用如下编译命令:

gcc -c main.c -o main.o
objcopy --update-section .MatrixData=matrix.dat main.o
ld main.o -o main.elf

使用objcopy将数据文件写入main.o的.MatrixData section位置。

需要注意几点:

1、.MatrixData的定义放在C语言中进行,方便获取地址,且可以确保其会被链入最终elf文件,且会被载入内存;

2、使用objcopy添加数据文件,必须是往main.o中,而不能是main.elf中,因为main.elf是连接后的文件,地址和各段长度都确定了,而main.o中只有长度,没有地址,当修改section内容时,只需要修改section长度即可,最终在link的过程中根据长度确定地址即可;

你可能感兴趣的:(linux,elf,objcopy,link)