为什么"可执行文件"操作系统依赖?

Moh*_*Ezz 38 linux windows compiler-construction executable operating-system

我知道每个CPU /架构都有自己的指令集,因此为特定CPU编写的程序(二进制)不能在另一个CPU上运行.但我真正理解的是为什么一个可执行文件(例如.exe之类的二进制文件)无法在Linux上运行,但即使在同一台机器上也可以在Windows上运行.

这是一个基本问题,我期待的答案是.exe和其他二进制格式可能不是原始机器指令,但它们包含一些依赖于操作系统的数据.如果这是真的,那么这个OS依赖的数据是什么样的?作为一个例子,.exe文件的格式是什么,以及它与Linux可执行文件之间的区别?

有没有来源我可以获得有关此的简要和详细信息?

Ale*_*ler 20

为了做有意义的事情,应用程序需要与操作系统连接.由于系统调用和用户空间基础结构在Windows和Unix/Linux上看起来根本不同,因此具有可执行程序的不同格式是最小的麻烦.这是需要改变的程序逻辑.

( - 因为他们被迫使用与操作系统有关的东西,但不相关的大多数应用程序你可能会认为这是毫无意义的,如果你有一个程序,完全依赖于标准化的部件,例如C运行时库这在理论上是如此).

Windows PE(EXE,DLL,..)文件和Linux ELF二进制文件之间的其他差异与两个操作系统的不同图像加载器和一些设计特征有关.例如,在Linux上,单独的程序用于解析外部库导入,而此功能是在Windows上内置的.另一个例子:Linux共享库的功能与Windows上的DLL不同.更不用说两种格式都经过优化,以使相应的OS内核能够尽快加载程序.

像Wine这样的仿真器试图填补空白(实际证明最大的问题不是二进制格式,而是OS界面!).

  • 但是Wine不是模拟器! (12认同)

S.L*_*ott 5

.exe和其他二进制格式[绝对]不是原始机器指令,但它们包含一些依赖于操作系统的数据.

这个OS依赖的数据是什么样的?作为一个例子,.exe文件的格式是什么,以及它与Linux可执行文件之间的区别?

好吧,我猜Google完全失败了.Windows文档非常明确地定义了.EXE格式.

http://support.microsoft.com/kb/65122

Linux ld应用程序在"exec"之前将可执行文件加载到内存中.你可以阅读ld格式甚至是着名的a.out文件.

http://linux.die.net/man/1/ld

http://en.wikipedia.org/wiki/A.out

http://en.wikipedia.org/wiki/Executable


Ing*_*ngo 5

除了必须由系统加载程序识别的可执行格式(即将可执行文件带入内存的操作系统的一部分)之外,真正的问题是操作系统的接口.您可以将操作系统视为一种API,它提供了执行特定操作时必须调用的入口点,例如,将字符写入控制台.

这些细节通常或多或少地隐藏在最终用户之外,因此您可以使用更高级语言中的相同源代码将字符写入屏幕.但通常情况会更加不同,例如Windowing环境.并非所有高级语言都提供窗口层,即使在这些差异上也是如此.