我的命令行程序的构建过程生成一个二进制文件(超过500KB),目前必须通过argv的路径引用。我想将此文件嵌入可执行文件中。
在Linux上,appears possible使用objcopy
从二进制文件制作目标文件:
objcopy --input binary --output elf32-i386 --binary-architecture i386 myfile.dat myfile.o
但是,OS X开发人员工具链不包含objcopy命令。没有安装binutils,有什么可能性?
我从Xcode构建我的项目,并使用自定义构建规则生成文件。
答案 0 :(得分:4)
在链接阶段,将参数-sectcreate <segname> <sectname> <file>
传递给链接器。如果您通过调用编译器来驱动链接器(这很常见),则将其作为-Wl,-sectcreate,<segname>,<sectname>,<file>
传递。
您将组成细分和部分名称。
您可以使用getsectdata()
function和_dyld_get_image_vmaddr_slide()
在运行时获取指向数据的指针。
答案 1 :(得分:2)
如this other question about objcopy
所示,将二进制文件包含在可执行文件中的另一种方法是使用.incbin
汇编程序指令。与objcopy
相比,此解决方案有两个主要优点:开发人员控制符号名称(objcopy
似乎有一个固定的方案来命名它们),而且,它不需要{{ 1}}。
该解决方案还优于基于链接器的objcopy
解决方案。它是跨平台的,访问数据要简单得多。
我正在使用此Xcode构建规则脚本来生成要包含的文件和带有-sectcreate
指令的程序集文件:
.incbin
然后,给定使用此规则处理的文件“somefile.gen”,程序集将如下所示:
my_generation_tool -o $DERIVED_FILE_DIR/$INPUT_FILE_NAME.out $INPUT_FILE_PATH
export AS_PATH=$DERIVED_FILE_DIR/$INPUT_FILE_NAME.out.s
echo "\t.global _data_start_$INPUT_FILE_BASE" > $AS_PATH
echo "\t.global _data_end_$INPUT_FILE_BASE" >> $AS_PATH
echo "_data_start_ $INPUT_FILE_BASE:" >> $AS_PATH
echo "\t.incbin \"$INPUT_FILE_NAME.out\"" >> $AS_PATH
echo "_data_end_$INPUT_FILE_BASE:" >> $AS_PATH
可以使用 .global _data_start_somefile
.global _data_end_somefile
_data_start_somefile:
.incbin "somefile.gen.out"
_data_end_somefile:
和data_start_somefile
符号在C中访问数据(macOS链接器使用伪data_end_somefile
前缀C名称,这就是汇编文件包含它们的原因):< / p>
_
另一个帖子的答案有更多的花里胡哨,有些人可能觉得有用(例如,extern char data_start_somefile, data_end_somefile;
for (const char* c = &data_start_somefile; c != &data_end_somefile; ++c)
{
// do something with character
}
符号)。