【问题标题】:How to link g++ itself to my project?如何将 g++ 本身链接到我的项目?
【发布时间】:2016-06-26 13:52:41
【问题描述】:


所以为了清楚起见,我的目标是编写一个可以保存自己代码的关键部分的代码(比如 main func 或其他类或类似的东西) 我将只是将它们复制到一个类中,然后我希望我的程序使用用户输入添加/删除一些代码(func,obj,class,...),毕竟我希望它再次重新生成该代码并且创建自动保存代码关键部分的类,我希望它编译并删除自己。

因此,除了我希望它编译该代码的部分之外,我已经计划并弄清楚了上述所有内容,是否有将 g++ 链接到我的代码?但我知道 g++ 有一个主函数,这不会对我的主函数造成问题吗? + 我无法在现有系统上使用编译器,也无法将编译器作为单独的可执行文件...

【问题讨论】:

  • 你不能只链接 g++。可执行文件不能链接到其他可执行文件,而且 g++ 不仅仅是一个可执行文件(它需要大量文件才能工作)。最好的方法是使用 GCC 的外部副本来创建可以加载的动态对象,或者使用 LLVM 生成代码。
  • 我认为 g++ 是一个 exe,但我们不能使用预编译的二进制文件......我刚刚提到我不能使用外部的东西......请阅读 txt......什么是 llvm?跨度>
  • 好吧,我用谷歌搜索了 LLVM,似乎是个不错的选择,但我必须使用 llvm 库编写自己的编译器吗?
  • 为什么不能使用外部的东西?这会让事情变得异常困难。
  • @shervin:这远远超出了你目前的能力。我建议学习以下科目:CS 基础、操作系统理论、编译器设计和构造以及汇编语言编程。这将为您提供完成此类任务所需的背景。

标签: c++ linker g++ gnu ld


【解决方案1】:

您不需要将代码与编译器链接。您可以使用编译器打包您的可执行文件。您的代码可以生成 C++ 源代码,然后调用编译器生成新的可执行文件。

请记住,大多数编译器都非常庞大。尝试在您的系统上安装 G++ 或 MinGW 以获得理解。

有关更多详细信息,请在互联网上搜索“编译器设计理论”,它会为您提供有关将 C++ 等语言翻译成可执行文件的信息。

此外,您需要让操作系统启动新的可执行文件(并终止当前实例)。这需要对操作系统的 API 进行一些研究。

恕我直言,最好的方法是使用解释性或脚本语言。另一种方法是让您的 C++ 程序执行一个或多个脚本。

编辑 1:非常低级
在最低级别,需要生成微码(处理器处理的命令字节)。

步骤如下:

  1. 生成微码并放置在内存中的某个已知位置 (您有权访问并具有执行权限)。
  2. 将执行转移到微码,记得推送返回 堆栈上的地址。

最难的部分是生成微码,尤其是调整所有分支指令的目标地址(除非您使用名为 Position Independent Code 的东西)。

您可能会花费数月或数年的时间来编写生成微代码的代码,或者弄清楚如何使用编译器(如 CLang 或 G++)。

【讨论】:

  • 是的,差不多就是这样,但我认为因为用户第一次运行我的代码我拥有用户拥有的权限,如果他是 root,我想我可以更改 ip 注册cpu 运行生成的代码,否则我需要编写一些程序集来使用一些长 jmps,除了生成部分之外,所有这些都可以处理:(
  • 我认为您的意思是“机器码”而不是“微码”。微码是一组较低级别的指令,通常根本无法访问。
猜你喜欢
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 2021-08-25
  • 2022-12-25
  • 1970-01-01
  • 2021-06-14
  • 2012-07-01
  • 1970-01-01
相关资源
最近更新 更多