在 ReactOS 上运行 ELF 二进制文件
Running ELF binaries on ReactOS
请耐心回答,因为我是所有这些的新手,并希望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兼容层。
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- 挂接静态链接的 ELF 二进制文件
- 如何获取与 objdump 输出的标签相对应的 ELF 二进制文件中的文件偏移量
- 如何使GCC将.text部分编译为可写入ELF二进制文件
- 将动态链接的elf二进制文件转换为静态链接的
- 从GCC 2.95生成的ELF二进制文件中恢复c++类声明
- 在 ReactOS 上运行 ELF 二进制文件