gpt4 book ai didi

c++ - 在 ReactOS 上运行 ELF 二进制文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:52:02 24 4
gpt4 key购买 nike

请耐心回答,因为我是这一切的新手,希望 100% 正确地掌握我的基础知识。我是一名机械工程师,所以不要苛刻。我正在学习一些非常基本的底层知识,并且有兴趣了解与编译器后端相关的概念。 C/C++ 编译器输出的可能是专门为计算机体系结构量身定做的机器码。这也意味着如果 Windows 和 Linux 在相同的硬件(例如 i7 处理器)上运行,则它在 Windows 和 Linux 中应该是相同的。但是二进制格式的形式还有另一层差异。也就是说,我们在 Linux 上有 ELF( Executable and Linkable Format ),在 Windows 上有 PE/COFF( Portable Executable )。

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

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

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

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

最佳答案

加载程序还不够。

操作系统有自己的系统调用接口(interface)。 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 的 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 兼容的操作系统,所以像 Linux Compatibility Layer 这样的东西也就不足为奇了。 BSD 存在。

关于c++ - 在 ReactOS 上运行 ELF 二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14685092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com