在我的游戏项目中,我使用第二个答案中描述的方法实现了嵌入式ZIP资源文件(使用blob.S来嵌入和标记ZIP):
Is there any standard way of embedding resources into Linux executable image?
从长远来看,我想简化构建过程并摆脱额外的依赖关系。在这种情况下,目前建筑需要DMD和GCC。为了在没有GCC的情况下嵌入ZIP,我尝试了在这里描述的exe之后的cat ZIP(第六个答案):
C/C++ with GCC: Statically add resource files to executable/library
粗略地说,它的工作原理如下:
$ rdmd project.d
$ zip resources.zip resources/
$ cat resources.zip >> project
打开exe中的zip:
auto exeimage = new MmFile("/proc/self/exe");
archive = new ZipArchive(exeimage[]);
问题在于ZipArchive不喜欢存档开头的额外“垃圾”(可执行文件):
std.zip.ZipException@std/zip.d(41): ZipException: invalid directory entry 1
检查“zip”的内容是否可以从命令行工作(尽管它会警告文件开头有额外的垃圾):
$ unzip -l project
Archive: project
warning [project]: 8525231 extra bytes at beginning or within zipfile
(attempting to process anyway)
Length Date Time Name
--------- ---------- ----- ----
0 2014-11-14 08:01 resources/
...
现在,我的问题是,是否有任何简单易行的方法让ZipArchive在开始时忽略“垃圾”?
如果不是,是否有简单的方法可以在文件的开头获取可执行映像的大小,以便能够像这样创建存档:
archive = new ZipArchive(exeimage[exesize .. exeimage.length]);
作为一个额外的问题,有没有人知道可执行图像是否已经在整个过程的地址空间中进行了mmap,或者它是否只包含链接的部分(文本,数据......)?