可能重复:
Why an executable program for a specific CPU does not work on Linux and Windows?
为什么用linux编写的程序不能在windows中执行?假设我编译了一个简单的C程序,其中包含windows和linux共有的函数调用,编译器是否在windows和linux下生成不同的二进制文件?
答案 0 :(得分:5)
答案 1 :(得分:5)
以下是我能想到的一些原因:
答案 2 :(得分:3)
二进制类型不同。例如,Linux可能使用Executable and Linkable格式,而Windows使用Portable Executable格式。
但最大的问题是API。 Windows程序会调用Windows API来设置它的进程,如堆栈,并分配内存。很明显,这些API调用在其他操作系统上不可用。
答案 3 :(得分:3)
是的,可执行文件使用不同的文件格式。在这两种情况下,加载可执行文件以创建进程涉及大量工作,并且两者(至少直接)都不包括处理加载其他二进制格式的代码。即使这样,大多数程序也会遇到很多问题。例如,相当多的Linux程序链接到共享库,因此要在Windows下成功加载它们,您不仅需要加载器,还需要代替该共享库的东西副本。实际上,当然,不仅有一个共享库 - 有几十个。当你模仿它们时,你将有相当大一部分操作系统作为一个整体移植到Windows。
答案 4 :(得分:0)
在Windows和Linux中都没有单一的函数调用可以影响进程的地址空间,即使你可以让两个系统都执行程序。除了:
void f()
{
*((char*)0) = 0;
}