C Linux&;windows程序不同
我用GCC编译了一个小的“helloworld”程序&它在Linux下工作。然后,我在程序中添加了.exe扩展名,以查看它是否适用于windows。但它没有起作用。这个程序不能在windows中运行的原因是什么。基本上,在windows和linux下编译的程序中,二进制和汇编指令是相同的(如果未使用特定于操作系统的库)。操作系统只需将程序加载到RAM中,处理器就会执行它。那么,为什么它不起作用呢。Linux和Windows可执行文件之间的主要区别在于格式。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使用 你必
你必须在每个平台上编译你的程序。对Windows来说可能很有趣。现代操作系统并不是那么容易。如果您获取Linux可执行文件,添加EXE扩展,并在Windows中运行,则它将无法工作。除了代码和数据之外,现代操作系统在可执行文件中还有很多额外的信息。Linux使用格式,Windows使用。此格式包括信息、内存大小、分区以及有时仅与使用此可执行格式的操作系统相关的信息。因此,仅仅更改文件的扩展名是行不通的
此外,它们的名称也有所不同。Linux在Windows运行时对系统调用使用软件中断(INT 0x80 IIRC)。这意味着您必须为每个标记重新编译,因为即使系统调用也不是以相同的方式完成的,C编译器需要针对该目标的正确libc进行链接。您认为代码应该相同的假设并不完全正确。虽然数学计算的工作原理是一样的,但不同的操作系统为程序提供相同的接口是错误的——它们没有。见:
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的差异产生不同的程序集
操作系统必须