将数据附加到可执行文件(Windows,Unix)

时间:2012-01-03 10:00:07

标签: c windows unix

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

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

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

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

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

有没有办法操作exe所以对于加载器是可以接受的(介意这是一个跨平台程序)?

2 个答案:

答案 0 :(得分:0)

  

对于加载器是可以接受的(介意这是一个跨平台程序)?

我认为如果没有特定于平台,这是不可能的。具有不同实现的通用接口的时间(因此保存/加载脚本的代码很常见,但可执行操作是特定的)。

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

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

答案 1 :(得分:0)

你说“脚本”,所以我想你有一个包含脚本的单独文件(文本文件?)。您可以编写一个简单的程序来读取脚本文件并以可编译的形式将其转换(例如,包含字节数组初始化的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上运行,前提是您安装了Windows版本的GNU binutils(例如cygwin)。