在 ReactOS 上运行 ELF 二进制文件

Running ELF binaries on ReactOS

本文关键字:ELF 二进制文件 运行 ReactOS      更新时间:2023-10-16

请耐心回答,因为我是所有这些的新手,并希望100%正确掌握基础知识。我是一名机械工程师,所以不要苛刻。我正在学习一些非常基本的低级内容,并且有兴趣理解与编译器后端相关的概念。C/C++编译器输出可能是专门为计算机体系结构定制的机器代码。这也意味着,如果 Windows 和 Linux 都运行在相同的硬件上,比如 i7 处理器,那么它应该是一样的。但是二进制格式的形式还有另一层区别。也就是说,我们在Linux上有ELF(可执行和可链接格式),在Windows上有PE/COFF(可移植可执行文件)。

因此,我觉得Linux和Windows上的编译器具有不同的工作方式的后端,并以ELF或PE/COFF格式发出二进制文件。

ReactOS是Windows的克隆,与Windows在一定程度上是二进制兼容的。

理论上是否有可能在ReactOS中拥有一个理解ELF并正确加载它的加载器?

我知道我们需要一层软件将Linux API映射到ReactOS API。如果存在这样的映射图层,我的问题有意义吗?

加载器是不够的。

操作系统有自己的系统调用接口。我对Linux和Windows二进制API了解不多,上次我直接使用系统调用是MS-DOS。

在MS-DOS中,可以通过将函数代码加载到AH寄存器来调用DOS函数,然后调用INT 21H。 寄存器 AL 通常用作子函数或主要参数。 例如,我可以回忆起如何退出程序:

    MOV AX,4C01H   ; funciton AH = $4C (exit), error code is AH = 1
    INT 21H
; program gets never here

因此,其他操作系统提供了其他时尚界面。 例如,AmigaDOS 在绝对地址 4 上具有 exec.library 的地址(是的,$00000004),并且可以通过位于库"基"地址(-4、-8 等)负偏移量的跳转表访问库函数。其他库的指针可以通过使用 open 函数从 exec.library 询问。

好的,MS-DOS和AmigaDOS在不同的体系结构上运行,但这是一个很好的例子,说明操作系统调用可能有所不同。软件中断与第一个库提供的库地址。

有时,差异是一种运气。当不同的操作系统调用不干扰时,可以编写一个包装器,该包装器接收外来操作系统调用,并将它们转换为主机操作系统。如果操作系统 API 仅区分系统调用的参数顺序,那将是完美的 - 但情况更加困难。更简单的函数可以映射到其他操作系统的风格,但更复杂的函数 - 带有回调!- 更难。包装器不仅可以模拟函数,还可以模拟操作系统的错误。

无论如何,这种类型的东西有一些好东西。

一个很好的例子是CygWin,它允许你在Win32下运行Linux程序。当我上次使用它时,运行任何命令行内容都没有问题,即使使用线程、网络等也是如此。编辑:正如@fortran所说,它需要重新编译和库。

对于Linux来说,WINE是运行Win32应用程序的一个很好的努力。甚至还有官方Linux版本的商业软件,它们使用WINE!如果您的程序没有使用最新的 Windows API 调用,WINE 应该可以工作。

由于Linux和BSD

都是POSIX兼容的操作系统,因此存在这样的东西也就不足为奇了,例如BSD的Linux兼容层。