我有一个静态 ELF 二进制文件,它从 zip 文件中读取数据。为了简化分发,我想将 zip 文件附加到二进制文件中,如下所示:
$ cat mydata.zip >> mybinary
我知道这样做不会损坏 mybinary,但我不知道如何访问 mydata.zip 的内容。是否可以?如果是这样,怎么办?
在过去,我使用了附加数据然后附加数据长度的技巧,这样我所要做的就是打开二进制文件,读取流的最后一个 int,倒带该长度然后开始解压缩,但是由于各种原因,这在这里不起作用(例如,我不能保证当需要 zip 文件时该文件仍然在光盘上)。
如果该解决方案适用于 OS X 和 MinGW,那么全方位的超级额外加分。
假设在应用程序执行开始时您可以访问该文件,那么打开该文件的句柄应该可以防止操作系统删除磁盘上的文件,直到对该文件的最后一个引用被关闭。这将允许您在文件中查找您想要的内容,使用该文件句柄而无需担心。
创建一个全局变量:
int app_fd;
其中大多数的过程是相同的,在主例程中,只需发出:
app_fd = open(argv[0], O_RDONLY);
在执行开始时。当执行过程中需要访问 zip 文件时,只需使用文件描述符,而不是文件名。
在运行时,如果您没有某种形式的应用程序原始内容句柄,那么您可能无法访问 zip 文件的内容。这是因为加载程序仅映射文件中预期的部分。二进制文件末尾的内容将被视为垃圾并且不会被映射。
要完成将 zip 文件映射到内存中,您需要遵循不同的策略。您需要将 .zip 嵌入到二进制文件的 ELF(linux)/COFF(Windows)/Mach-O(Mac OS X) 部分,该部分具有设置的属性,以便保证映射到应用程序中(这需要应用程序中有很多前期工作,处理过程中有很多后期工作)。这并不是一件小事,可能需要相当多的编码才能使其适合每个平台。
顺便说一句,在应用程序运行时从 Windows 系统中删除该应用程序并不是一件容易的事(我认为如果它驻留在 NTFS 上,您可以移动它)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)