将二进制文件嵌入可执行程序的简便方法

有时候,出于某种考虑,我们需要将某些数据文件嵌入到可执行程序中。在windows平台下,通常可以使用资源文件的方式。但如果希望跨平台,例如在Linux, Unix中取得类似的效果,可以将数据文件转换成c语言源文件,编译到最终代码中。在Linux/Unix下转换方法也很简单,一条语句即可搞定:

 

 

(echo "const unsigned char binary_data[] = {"; od -txC myfile.bin | sed -e "s/^[0-9]*//" -e s"/ /([0-9a-f][0-9a-f]/)/0x/1,/g" -e"/$d" | sed -e"/$s/,$/};/") >myfile.c
使用 objcopy 将文件嵌入到可执行文件,可以将该文件作为程序的资源文件,方便程序运行时读取。以下是在 Linux 系统使用 objcopy 将文件嵌入到可执行文件的步骤: 1. 准备要嵌入文件,这里以一个名为 `resource.txt` 的文本文件为例。 2. 编译可执行文件,需要在编译时指定 `-Wl,-rpath,.` 选项,将当前目录添加到运行时链接库搜索路径。例如: ``` gcc -o myapp myapp.c -Wl,-rpath,. ``` 3. 使用 objcopy 将 `resource.txt` 嵌入到可执行文件。命令如下: ``` objcopy --input binary \ --output elf64-x86-64 \ --binary-architecture i386 \ --add-section .myresource=resource.txt \ myapp ``` 其,`--input binary` 选项指定输入文件类型为二进制文件,`--output elf64-x86-64` 选项指定输出文件类型为 64 位 ELF 文件,`--binary-architecture i386` 选项指定输入文件的架构为 i386。`--add-section .myresource=resource.txt` 选项指定将 `resource.txt` 添加到可执行文件的 `.myresource` 节(section) 。`myapp` 是可执行文件的名称。 4. 在程序读取嵌入文件。以下是一个简单的读取 `resource.txt` 的例子: ```c #include <stdio.h> #include <stdlib.h> extern char _binary_myapp_start; extern char _binary_myapp_end; int main() { char *start = &_binary_myapp_start; char *end = &_binary_myapp_end; int size = end - start; char *buf = (char *)malloc(size + 1); memcpy(buf, start, size); buf[size] = '\0'; printf("%s\n", buf); free(buf); return 0; } ``` 注意,这里使用了 `_binary_myapp_start` 和 `_binary_myapp_end` 符号来获取嵌入文件的起始地址和结束地址,因此需要将文件名前缀改为 `_binary_`,并用下划线代替文件的点号和斜杠。 在 Linux 系统嵌入文件的数据会被放在可执行文件的 .myresource 节,其起始地址为 `_binary_myapp_start`,结束地址为 `_binary_myapp_end`。因此,在程序可以通过 `_binary_myapp_start` 和 `_binary_myapp_end` 来获取嵌入文件的数据,并将其读入内存
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值