C Linux&;windows程序不同

C Linux&;windows程序不同,c,linux,windows,ram,processor,C,Linux,Windows,Ram,Processor,我用GCC编译了一个小的“helloworld”程序&它在Linux下工作。然后,我在程序中添加了.exe扩展名,以查看它是否适用于windows。但它没有起作用。这个程序不能在windows中运行的原因是什么。基本上,在windows和linux下编译的程序中,二进制和汇编指令是相同的(如果未使用特定于操作系统的库)。操作系统只需将程序加载到RAM中,处理器就会执行它。那么,为什么它不起作用呢。Linux和Windows可执行文件之间的主要区别在于格式。Linux使用,Windows使用 你必

我用GCC编译了一个小的“helloworld”程序&它在Linux下工作。然后,我在程序中添加了.exe扩展名,以查看它是否适用于windows。但它没有起作用。这个程序不能在windows中运行的原因是什么。基本上,在windows和linux下编译的程序中,二进制和汇编指令是相同的(如果未使用特定于操作系统的库)。操作系统只需将程序加载到RAM中,处理器就会执行它。那么,为什么它不起作用呢。

Linux和Windows可执行文件之间的主要区别在于格式。Linux使用,Windows使用


你必须在每个平台上编译你的程序。对Windows来说可能很有趣。

现代操作系统并不是那么容易。如果您获取Linux可执行文件,添加EXE扩展,并在Windows中运行,则它将无法工作。除了代码和数据之外,现代操作系统在可执行文件中还有很多额外的信息。Linux使用格式,Windows使用。此格式包括信息、内存大小、分区以及有时仅与使用此可执行格式的操作系统相关的信息。因此,仅仅更改文件的扩展名是行不通的


此外,它们的名称也有所不同。Linux在Windows运行时对系统调用使用软件中断(INT 0x80 IIRC)。这意味着您必须为每个标记重新编译,因为即使系统调用也不是以相同的方式完成的,C编译器需要针对该目标的正确libc进行链接。

您认为代码应该相同的假设并不完全正确。虽然数学计算的工作原理是一样的,但不同的操作系统为程序提供相同的接口是错误的——它们没有。见:


我将把你的问题分成几个小部分

我用GCC编译了一个小的“helloworld”程序&它在Linux下工作

这是意料之中的,因为系统上安装的通常GCC和Binutil被配置为在同一目标和主机上编译。或者用外行的话说,它们将生成一个适合Linux内核和GNUC标准库(或兼容的libc)运行时的可执行文件

还有一些编译器可以构建程序,使其在不同类型的操作系统和/或CPU体系结构上运行,而不是在其上执行。这些就是所谓的交叉编译器,你可以用它们在桌面电脑上构建智能手机应用程序。当您使用Windows Android NDK创建本机Android可执行文件时,实际上您是在为Linux内核和不同的CPU(很可能是ARM或MIPS)进行交叉编译

然后,我在程序中添加了.exe扩展名,以查看它是否适用于windows

在这里,你陷入了一个误解,我永远都不明白为什么它会出现在第一位。文件名后缀与它所能做的任何事情都有关系。Windows使用它在注册表中查找,如何处理它,但仅此而已。在Windows中,您可以注册任何要被识别为“可执行”的后缀。Linux(作为一个Unixoid)做的事情更简单,但功能更强大:每个文件都带有一组标志,如果可以执行,如果可以,谁真正可以执行

但要使系统作为一个可以运行的程序真正发挥作用,需要一些不同的东西,并且所有可执行文件(对于给定的操作系统)共享,而不管它们的文件名是什么:一种特定的内部格式。Windows使用所谓的
PE
格式(PE代表可移植可执行文件,这有点可笑,因为唯一支持它的操作系统是Windows)。Linux和*BSD使用ELF(可执行文件和链接格式),MacOS X使用Mach二进制格式,并将传输到Intel CPU扩展为Mach通用二进制格式。从技术上讲,Mach内核(MaCMOS X的基础)也可以理解ELF格式,但这在MACOS X.< 虽然这两种文件格式本质上做的是相同的事情(描述如何将文件加载到内存中,它依赖于哪些库,必须加载哪些库,在哪里加载它们,实际启动程序的哪个点),但它们的结构非常不同。Windows不知道如何加载和执行ELFs,Linux不知道如何加载和执行PEs

即使其中一方支持另一方,系统仍然缺少程序预期加载和运行的库。至少您需要依赖于(操作系统)的运行时环境,它负责诸如从操作系统检索启动参数、提供操作系统特定内存管理功能的接口等“平凡”的事情。这些在Linux和Windows之间也有根本的不同

请注意,完全有可能提供一个兼容性包装器,它构建在特定于操作系统的东西之上,可以将其他操作系统模拟成一个程序,并且还知道如何加载、链接和启动外部可执行文件。用于在Linux上加载和执行Windows程序的包装器称为WINE,还有一种相反的东西称为LINE,它在Windows上运行Linux可执行文件

但它没有起作用。这个程序不能在windows中运行的原因是什么

Windows与Linux不同。它有一个完全不同的系统级API,它使用不同的二进制格式,甚至像stdin/stdout这样的基本东西(由C标准库定义)的实现也非常不同。见鬼,他们甚至使用不同的

Linux使用标准的C调用约定(stdcall)。Windows主要使用cdecl约定,它是pascal和stdcall约定的混合体

基本上,在windows和linux下编译的程序中,二进制和汇编指令是相同的(如果未使用特定于操作系统的库)

不,他们绝对不是。调用约定allone的差异产生不同的程序集

操作系统必须