ZipArchive 与嵌入式 ZIP 连接到 EXE

ZipArchive with embedded ZIP concated to EXE

在我的游戏项目中,我使用第二个答案中描述的方法实现了嵌入的 ZIP 资源文件(使用 blob.S 嵌入和标记 ZIP):

Is there any standard way of embedding resources into Linux executable image?

在长 运行 中,我想简化构建过程并摆脱额外的依赖项。在这种情况下,目前构建需要 DMD 和 GCC。为了在没有 GCC 的情况下嵌入 ZIP,我尝试了在此处描述的 exe 之后对 ZIP 进行 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 不喜欢存档开头的额外 "garbage"(可执行文件):

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 忽略开头的 "garbage"?

如果不是,是否有简单的方法来获取文件开头的可执行映像的大小,以便能够像这样创建存档:

archive = new ZipArchive(exeimage[exesize .. exeimage.length]);

作为一个额外的问题,有谁知道可执行映像是否已经在进程的地址 space 中作为一个整体映射,或者它是否仅包含链接部分(文本、数据、... )?

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