Hi3519A将资源文件编译到可执行文件或动态库中

       在工作中我们有时需要将资源文件(如:图片,.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;
}

结果如下:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值