【问题标题】:Make an executable at runtime在运行时生成可执行文件
【发布时间】:2010-02-15 15:00:40
【问题描述】:

好的,所以我想知道如何创建一个程序来创建第二个程序(就像大多数压缩程序可以创建自提取自可执行文件一样,但这不是我需要的)。

假设我有 2 个程序。每个包含一个类。我将使用一个程序来修改和填充数据类。第二个文件将是一个也有该类的程序,但为空,它的唯一目的是以特定方式访问这些数据。我不知道,我在想是否特定类被序列化然后“注入”到第二个文件中。但是一个人怎么能做到这一点呢?我发现修改已经编译好的文件很有趣,尽管我从来没有能够做出不会导致错误的更改。

这只是一个想法。我不知道解决方案是什么,这只是我的想法。

我更喜欢跨平台的 c 或 c++ 中的一些信息。我唯一能接受的其他语言是 c#。

还有

我不是在寻找 3-rd 方库或诸如 Boost 之类的东西。如果有什么事情我只需要朝着正确的方向推进的话。

++还有

我不想使用编译器。

Jalf 确实阅读了我写的内容

这正是我想知道的。我认为根据我上面的要求,这很明显。关于编译文件或编写脚本,我只字未提。

QUOTE "我发现修改已经编译好的文件很有趣"

请在发帖前先阅读并理解问题。

谢谢。

【问题讨论】:

  • 有什么特殊原因不能在运行时从文件中加载数据(例如从 CSV/XML/等)?
  • gcc 是一个能够创建其他程序的程序。
  • Grr...**暗示**,人们(和其他思考的存在,如果有的话)推断;数据、句子等暗示。 /pedantic 编辑器模式
  • 按照您提到的自解压可执行文件的工作方式执行此操作:它们不会在运行时生成新程序。他们只需将相同的一个程序写入文件,并仅自定义程序运行时加载的数据。
  • 您希望能够在运行时生成 C 或 C++ 或 C# 可执行代码,而无需使用编译器。在这一点上,没有合理的答案。投票结束时“不是一个真正的问题”。

标签: c# c++ c executable


【解决方案1】:

从头开始构建可执行文件很困难。首先,您需要为程序将要执行的操作生成机器代码,然后您需要将这些代码封装在可执行文件中。除非您想为一种语言编写编译器,否则这太过分了。

这些生成自解压可执行文件的实用程序并不能真正从头开始制作可执行文件。他们预先生成了可执行文件,数据文件只是附加到它的末尾。由于 Windows 可执行格式允许您将数据放在文件的末尾,因此只关心“真正的可执行”部分(exe 标头告诉它有多大 - 其余部分被忽略)。

例如,尝试生成两个自解压 zip,并对它们进行二进制差异。你会看到他们的第一个 X KBytes 是完全相同的,其余的是变化,这根本不是可执行文件,它只是数据。执行文件时,它会查看文件末尾的内容(数据)并解压缩。

查看维基百科条目,转到外部链接部分进行更深入的挖掘: http://en.wikipedia.org/wiki/Portable_Executable

我在这里只提到了 Windows,但同样的原则也适用于 Linux。但是不要期望有跨平台的结果,你必须在每个平台上重新实现它。我无法想象比可执行文件更依赖平台的东西。即使您使用 C#,您也必须生成本机存根,如果您在 Windows(在 .net 下)或 Linux(在 Mono 下)上运行,这会有所不同。

【讨论】:

  • 完美。不过要指出的是,有 linux 和 windows 可执行文件……linux 只是不使用后缀 .exe 。但这很有趣,我没有意识到他们做了这么简单的事情。这对我来说几乎像是某种欺骗。但这基本上是我想知道的。谢谢。
  • 好吧,为了更正我写的内容,我应该说“...比可执行文件格式”,而不是“...比可执行文件格式”。 PE(Windows)实际上是 COFF(Unix)的变体,但是您有不同的运行时,OS API 的导入表中的不同符号等。所有这些都需要专门针对每个目标操作系统实现。而且今天 ELF 是类 Unix 操作系统中更流行的格式,它与 PE 和 COFF 有很大不同。
【解决方案2】:

使用程序生成的数据调用编译器(必要时将临时文件写入磁盘)和/或存储在磁盘上?

或者是写本地可执行格式的细节问题?

【讨论】:

  • 不幸的是,鉴于您不需要编译器,这是正确的答案,也是您在运行时获得可执行文件的唯一方法。
【解决方案3】:

不幸的是,对于 C、C++、Java 或 C# 等编译型语言,您将无法像在 PHP、Perl 和 ECMAscript 等解释型语言中那样在运行时“运行”新代码.必须首先编译代码,为此您需要一个编译器。没有办法解决这个问题。

如果您需要在两个单独的 EXE 之间复制保存/恢复功能,那么最好的办法是创建一个在两个程序之间共享的静态库,或者一个在两个程序之间共享的 DLL。这样一来,您只需编写一次该代码,它就可以被任意数量的程序使用。

另一方面,如果你真的遇到这样的情况,我的主要问题是,你想用这个来完成什么?即使在支持eval() 之类的语言中,自我修改代码通常也是您会发现的一些最讨厌和漏洞百出的东西。这甚至比完全用 GOTO 编写的程序还要糟糕。像这样的自我修改代码有很多用途,但 99% 的情况下这是错误的做法。

希望有帮助:)

【讨论】:

  • 至于您的第一段...请阅读我的编辑。我很欣赏其余的。谢谢。
【解决方案4】:

我遇到了同样的问题,我认为this 可以解决所有问题。 您可以将任何代码放在那里,如果正确,它将在运行时生成第二个可执行文件。

--添加--

总之,你有一些代码可以硬编码并存储在你的第一个 exe 文件的代码中,或者放在它之外。然后运行它并编译上述代码。如果一切正常,您将获得第二个可执行运行时编译。这一切都没有任何外部库!

【讨论】:

    【解决方案5】:

    好的,所以我想知道如何 去创建一个程序,那个 创建第二个程序

    您可以查看CodeDomHere is a tutorial

    【讨论】:

    • 也许我误读了我的发现,但它似乎并不相关。不过,我很欣赏这些链接,这比某些人所说的“使用 SomeFunction”要好。哦,好吧,如果我知道所有关于该功能的信息,我就不会问了:p
    【解决方案6】:

    您是否考虑过将 Lua 或 Python 等脚本语言嵌入到您的应用中?这将使您能够动态在运行时生成和执行代码。

    来自wikipedia

    动态编程语言是计算机科学中广泛使用的一个术语,用于描述一类高级编程语言,它们在运行时执行其他语言在编译期间可能执行的许多常见行为,如果有的话。这些行为可能包括程序扩展、添加新代码、扩展对象和定义或修改类型系统,所有这些都在程序执行期间进行。这些行为几乎可以用任何足够复杂的语言来模拟,但动态语言提供了直接利用它们的工具。

    【讨论】:

    • 我写了一个小脚本语言。感谢您的遮阳篷,但请阅读我的编辑。
    【解决方案7】:

    根据您所称的程序,Self-modifying code 可能会起作用。

    基本上,您在内存中的某处编写代码,就好像它是纯数据一样,然后调用它。 通常这是一个坏主意,但它很有趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多