【问题标题】:Appending data to an executable (Windows, Unix)将数据附加到可执行文件(Windows、Unix)
【发布时间】:2012-01-03 10:00:07
【问题描述】:

我有一个编译和运行脚本的程序。

为了创建脚本的独立版本,我保留了一个大的静态缓冲区来保存已编译的脚本。编译后的脚本被复制到程序的副本中,然后可以从该副本运行。

这很好用。但它也有一些缺点:

  • 缓冲区是静态的,如果没有编译则占用空间 里面的程序。
  • 如果要包含的脚本超出缓冲区的大小,我需要构建一个具有更大缓冲区的新版本。

我想将编译后的脚本添加到程序的末尾,但天真地这样做是行不通的,因为 exe 加载器会阻塞新的文件大小。

有没有办法操作 exe 以便加载程序可以接受(注意这是一个跨平台程序)?

【问题讨论】:

  • 您可以查看 7-zip 等程序如何创建自解压档案。也许您可以使用类似的方法来嵌入您的脚本?
  • 我想您想在不重新编译解释器的情况下合并已编译的脚本,对吗?否则你可以通过修改你的构建系统来解决这个问题......
  • 以上两位评论者都是中肯的。但是,我似乎找不到任何关于压缩程序如何做到这一点的例子。我希望能找到一些实用的源代码,省去剖析可执行映像的麻烦。
  • 此外,我担心当我过于冗长时会出现 TL;DR... 程序本身 - 而不是脚本 - 是一个编译器/解释器,它运行以专有语言编写的脚本,适合我们公司的需求。我只提供编译器/解释器,但希望提供仅使用编译版本的可能性(编译版本是加密的)。

标签: c windows unix


【解决方案1】:

加载器可以接受吗(注意这是一个跨平台程序)?

我认为如果不针对特定平台,这不太可能实现。是时候使用具有不同实现的通用接口了(因此保存/加载脚本的代码是通用的,但可执行操作是特定的)。

在 Windows 上,您会遇到正在运行的可执行文件被锁定以防修改的问题。通过处理副本可以解决此问题(但以完全确定的方式重命名的唯一方法是在启动时执行移动,但安排作业可能是可以接受的)。

在 Windows 上,向图像(可执行文件或 dll)添加数据的最简单方法是使用资源。定义自定义资源类型并添加到图像中(UpdateResource 函数),然后使用LoadResource 检索。

【讨论】:

  • 对于 unix/linux,您可以使用 objcopy 将部分添加到文件中,然后使用 libelf 读取它们(假设是 ELF 环境)。 mac 使用不同的文件格式(假设您正在构建 .app 实体,您可以将它们添加到二进制文件的资源部分并以这种方式使用它们。
【解决方案2】:

您说的是“脚本”,所以我想您有一个包含脚本的单独文件(文本文件?)。您可以编写一个简单的程序来读取脚本文件并将其转换为可编译的形式(例如,包含字节数组初始化的 C 源代码)。还有一些工具可用于将任意文件转换为可链接对象(.o 或 .obj)。在过去,我使用了来自 GNU bimutils 的命令“objcopy”。特别是在 linux 上:

objcopy -I binary -O elf32-i386 mydata mydata.o

此命令创建一个对象和三个公共符号,您可以使用它们来查找数据块的开始、结束和大小:

_binary_mydata_start _binary_mydata_end _binary_mydata_size

如果您安装了 Windows 版本的 GNU binutils(例如 cygwin),类似的东西也可以在 Windows 上运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2013-12-19
    相关资源
    最近更新 更多