在 ReactOS 上运行 ELF 二进制文件

问题描述 投票:0回答:1

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

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

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

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

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

binaryfiles elf react-os
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 的 exec.library 的地址位于绝对地址 4(是的,$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 兼容层

这样的东西也就不足为奇了。

© www.soinside.com 2019 - 2024. All rights reserved.