-2

我对http://www.muppetlabs.com/~breadbox/software/tiny/teensy.htmlhttp://shaurz.wordpress.com/2008/06/02/finding-linux-gateso1-in-assembly印象深刻/,现在我想用这些来做一些实际的事情。

4

2 回答 2

3

该教程已经告诉您为了不必将可执行文件链接到 libc 需要做的所有事情(即定义适当的入口和出口点)。

从那里,你可以做任何你喜欢的事情,只是你必须重新编写最简单的东西,比如printf等等,因为除了操作变量之外,几乎所有的东西都需要系统调用

让我重申,沿着这条路线走不会节省任何东西。你的 shell、你的初始化系统、你的桌面环境都已经需要libc了,所以无论如何它已经被加载了。阅读“共享库”以了解为什么这意味着具有libc依赖性的额外可执行文件不会浪费内存。相反,如果你重新实现你需要的所有系统调用,所有这些实现必须加载到 RAM 中,在那里它不能与其他任何东西共享,因为其他所有东西都使用libc.

于 2013-09-10T09:53:42.413 回答
2

好吧,由于您将不得不做许多需要与操作系统通信的事情(假设是 Linux),因此您必须进行系统调用。由于这些通常由 C 运行时库实现,因此您将不得不重新实现它们。

至少我会假设您需要进行系统调用:

  1. 查询文件,了解其大小
  2. 分配所需的内存
  3. 将内存映射到进程的地址空间,确保其可执行
  4. 要求内核将命名文件加载到新分配的内存中

那么它可能或多或少是直接的应用程序级代码:

  1. 检查加载数据的 ELF 标头,识别入口点
  2. 为静态数据应用初始化器
  3. 重新定位任何与位置无关的代码以正确引用映射空间

我几乎可以肯定错过了很多东西。虽然这不是“魔术”,但它仍然非常繁重。至少可以说,你的工作会为你完成。享受。

于 2013-09-10T09:49:12.440 回答