如何在Mac OS X上的可执行文件中嵌入二进制文件的内容?

时间:2016-01-06 19:38:10

标签: xcode macos objcopy

我的命令行程序的构建过程生成一个二进制文件(超过500KB),目前必须通过argv的路径引用。我想将此文件嵌入可执行文件中。

在Linux上,appears possible使用objcopy从二进制文件制作目标文件:

objcopy --input binary --output elf32-i386 --binary-architecture i386 myfile.dat myfile.o

但是,OS X开发人员工具链不包含objcopy命令。没有安装binutils,有什么可能性?

我从Xcode构建我的项目,并使用自定义构建规则生成文件。

2 个答案:

答案 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 } 符号)。