在工作中我们有时需要将资源文件(如:图片,.wk文件等)直接编译到可执行文件或者动态库中,为了防止其他人拿到该文件。解决该方法的思路为:1.通过编译工具链中的objcopy工具将资源文件拷贝到一个.o文件中;2.在编译生成可执行文件或动态库时将该.o文件直接链接进去即可。具体步骤如下:
平台和环境:hisi3519A,交叉编译工具链arm-himix200-linux。
第一步:将资源文件拷贝到一个.o文件中
测试dome我自己建了一个test.txt文件,内容为“holle world”。
使用arm-himix200-linux-objcopy工具将test.txt拷贝到一个test.o文件中,命令如下:
arm-himix200-linux-objcopy -I binary -O elf32-littlearm -B armv5t test.txt test.o
其中-I表示输入文件的BFD格式,一般使用的都是binary;-O为输出文件的BFD格式,hisi3519A用的是elf32-littlearm;-B 输入是无结构时需要指定,它指定输出文件的结构,hisi3519A使用的是armv5t。
objcopy支持的格式可以通过arm-himix200-linux-objcopy --help查看,hisi3519A支持的BFD格式如下图所示:
通过以下命令查看test.o中的符号:
arm-himix200-linux-nm test.o
结果如图所示:
第二步:将.o文件链接到可执行文件或动态库中
编译链接过程使用的是CMake执行的,具体代码如下:
cmake_minimum_required(VERSION 2.6)
project(dome)
set(CMAKE_SYSTEM_NAME Linux)
set(TOOLCHAIN_DIR "/opt/hisi-linux/x86-arm/arm-himix200-linux")
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-himix200-linux-g++)
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-himix200-linux-gcc)
add_executable(dome main.cpp test.o)
# add_library(dome SHARED main.cpp test.o)
add_executable(dome main.cpp test.o)用于生成可执行文件
add_library(dome SHARED main.cpp test.o)用于生成动态库
在main.cpp中使用以下代码读取test.o中资源文件内容和长度:
#include <stdio.h>
//通过nm命令得到
extern char _binary_test_txt_end;
extern int _binary_test_txt_size;
extern char _binary_test_txt_start;
int main()
{
printf("holle world..\r\n");
printf("_binary_test_txt_size : %d\r\n", &_binary_test_txt_size);
printf("data : %s\r\n", &_binary_test_txt_start);
return 0;
}
结果如下: