我的命令行程序的生成过程生成了一个二进制文件(超过500KB),当前必须由argv的路径引用该文件。我想将此文件嵌入可执行文件中。
在Linux上,似乎可以用来objcopy
从二进制文件制作目标文件:
objcopy --input binary --output elf32-i386 --binary-architecture i386 myfile.dat myfile.o
但是,OS X开发人员工具链不包含objcopy命令。如果不安装binutils,有什么可能?
我从Xcode构建项目,并使用自定义构建规则生成文件。
正如关于的objcopy
另一个问题所证明的那样,将二进制文件包含到可执行文件中的另一种方法是使用.incbin
汇编程序指令。该解决方案在以下方面具有两个主要优点objcopy
:开发人员可以控制符号名称(objcopy
似乎有固定的名称命名方案),并且不需要objcopy
。
与基于链接器的-sectcreate
解决方案相比,该解决方案还具有优势。它是跨平台的,访问数据要简单得多。
我正在使用此Xcode构建规则脚本来生成要包含的文件和带有.incbin
伪指令的程序集文件:
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
然后,给定使用此规则处理的文件“ somefile.gen”,程序集将如下所示:
.global _data_start_somefile
.global _data_end_somefile
_data_start_somefile:
.incbin "somefile.gen.out"
_data_end_somefile:
可以使用data_start_somefile
和data_end_somefile
符号在C中访问数据(macOS链接程序在C名称前加上一个虚假的前缀_
,这就是汇编文件中包含它们的原因):
extern char data_start_somefile, data_end_somefile;
for (const char* c = &data_start_somefile; c != &data_end_somefile; ++c)
{
// do something with character
}
在另一线程上的答案有更多的花哨之处,有些人可能会觉得有用(例如,length
符号)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句