在ReactOS上运行ELF二进制文件

3
请耐心等待我的回答,因为我是新手,希望能够百分之百正确理解。我是一名机械工程师,所以请不要太苛刻。我正在学习一些非常基础的低级别的内容,对编译器后端相关的概念很感兴趣。C/C ++编译器输出的可能是专门针对计算机架构定制的机器码。这也意味着,如果Windows和Linux在相同的硬件上运行,比如i7处理器,它们应该是相同的。但是还有另一层差异,即二进制格式。也就是说,在Linux上我们有ELF(可执行和可链接格式),在Windows上有PE / COFF(便携式可执行文件)。

因此,我认为,Linux和Windows上的编译器具有不同的后端,并且以ELF或PE / COFF格式生成二进制文件。

ReactOS是Windows的一个克隆版本,并且在某种程度上与Windows兼容。

从理论上讲,在ReactOS中可以有一个LOADER来理解ELF并正确加载它吗?

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

1个回答

4

加载器不够用。

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

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

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

所以,其他操作系统提供其他时尚的界面。例如,AmigaDOS在绝对地址4(是的,$00000004)上具有exec.library的地址,并且可以通过位于库的“基址”的负偏移处的跳转表访问库函数(-4,-8等)。可以使用打开函数从exec.library中请求其他库的指针。
好的,MS-DOS和AmigaDOS运行在不同的体系结构上,但这是操作系统调用可能不同的一个很好的例子。第一个库提供的软件中断与库地址。
有时,差异是一种幸运。当不同的操作系统调用不会干扰时,可以编写包装器,该包装器接收外来操作系统调用,并将它们转换为主机操作系统。如果操作系统API仅区别于系统调用参数的顺序,那就太完美了-但情况更加困难。简单的函数可以映射到其他操作系统的风格,但是带有回调的更复杂的函数则更难。包装器不仅可以模拟功能,还可以模拟操作系统的错误。
无论如何,在这个类别中都有一些好东西。
一个很好的例子是CygWin,它可以让你在Win32下运行Linux程序。当我上次使用它时,即使涉及线程、网络等,也没有运行任何命令行内容的问题。编辑:正如@fortran所说,它需要重新编译和库文件。

对于Linux来说,WINE是一个很好的努力去运行Win32应用程序。甚至有一些商业软件的官方Linux版本使用了WINE!如果你的程序不使用最新的Windows API调用,WINE应该可以胜任。

由于Linux和BSD都是POSIX兼容的操作系统,因此Linux Compatibility Layer这样的事物在BSD中存在也就不足为奇了。


3
针对 Cygwin 和 Wine 的澄清说明... 使用 Cygwin 时,需要重新编译并链接到它们的运行库;而 Wine 可以加载和运行未经修改的 Windows 二进制文件。 - fortran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接