带嵌入式ZIP的ZipArchive连接到EXE

时间:2015-05-23 22:22:20

标签: d

在我的游戏项目中,我使用第二个答案中描述的方法实现了嵌入式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,或者它是否只包含链接的部分(文本,数据......)?

1 个答案:

答案 0 :(得分:2)

您可以使用import expressions在构建时在二进制文件中嵌入任意文件(作为字符串文字)。