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

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

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

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

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

从理论上讲,在ReactOS中有一个能够理解ELF并正确加载它的加载程序吗

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

加载器是不够的

操作系统有自己的系统调用接口。我不太了解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 yep,$00000004,可以通过位于库基址-4、-8等负偏移量的跳转表访问库函数。。可以使用open函数从exec.library请求其他库的指针

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

有时候,差异是一种运气。当不同的操作系统调用没有干扰时,可以编写一个包装器,它接收外来操作系统调用,并将它们转换到主机操作系统。如果操作系统API只在系统调用的参数顺序上有所不同,这将是完美的,但情况更为困难。更简单的函数可以映射到其他操作系统的风格,但更复杂的函数-使用回调更难。包装器不仅可以模拟功能,还可以模拟操作系统的bug

不管怎么说,在这一类型中有一些好东西

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

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

由于Linux和BSD都是POSIX兼容的操作系统,所以毫不奇怪,像BSD这样的东西存在。

加载器是不够的

操作系统有自己的系统调用接口。我不太了解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 yep,$00000004,可以通过位于库基址-4、-8等负偏移量的跳转表访问库函数。。可以使用open函数从exec.library请求其他库的指针

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

有时候,差异是一种运气。当不同的操作系统调用没有干扰时,可以编写一个包装器,它接收外来操作系统调用,并将它们转换到主机操作系统。如果操作系统API只在系统调用的参数顺序上有所不同,这将是完美的,但情况更为困难。更简单的函数可以映射到其他操作系统的风格,但更复杂的函数-使用回调更难。包装器不仅可以模拟功能,还可以模拟操作系统的bug

不管怎么说,在这一类型中有一些好东西

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

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


因为Linux和BSD都是POSIX兼容的操作系统,所以毫不奇怪,像BSD这样的东西是存在的。

只是对Cygwin和Wine的澄清。。。有了Cygwin,你需要重新编译并链接它们的运行库,Wine可以加载并运行不变的Windows二进制文件。。。有了Cygwin,您需要重新编译并链接它们的运行库,Wine可以加载并运行不变的Windows二进制文件。