我对http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html和http://shaurz.wordpress.com/2008/06/02/finding-linux-gateso1-in-assembly印象深刻/,现在我想用这些来做一些实际的事情。
问问题
73 次
2 回答
3
该教程已经告诉您为了不必将可执行文件链接到 libc 需要做的所有事情(即定义适当的入口和出口点)。
从那里,你可以做任何你喜欢的事情,只是你必须重新编写最简单的东西,比如printf
等等,因为除了操作变量之外,几乎所有的东西都需要系统调用。
让我重申,沿着这条路线走不会节省任何东西。你的 shell、你的初始化系统、你的桌面环境都已经需要libc
了,所以无论如何它已经被加载了。阅读“共享库”以了解为什么这意味着具有libc
依赖性的额外可执行文件不会浪费内存。相反,如果你重新实现你需要的所有系统调用,所有这些实现都必须加载到 RAM 中,在那里它不能与其他任何东西共享,因为其他所有东西都使用libc
.
于 2013-09-10T09:53:42.413 回答
2
好吧,由于您将不得不做许多需要与操作系统通信的事情(假设是 Linux),因此您必须进行系统调用。由于这些通常由 C 运行时库实现,因此您将不得不重新实现它们。
至少我会假设您需要进行系统调用:
- 查询文件,了解其大小
- 分配所需的内存
- 将内存映射到进程的地址空间,确保其可执行
- 要求内核将命名文件加载到新分配的内存中
那么它可能或多或少是直接的应用程序级代码:
- 检查加载数据的 ELF 标头,识别入口点
- 为静态数据应用初始化器
- 重新定位任何与位置无关的代码以正确引用映射空间
我几乎可以肯定错过了很多东西。虽然这不是“魔术”,但它仍然非常繁重。至少可以说,你的工作会为你完成。享受。
于 2013-09-10T09:49:12.440 回答