首页 文章

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

提问于
浏览
37

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

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

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

6 回答

  • 5

    一个非常天真的答案:

    • 由于不同的加工装载机,它们的结构不同;

    • 使用os依赖的功能,如系统调用,从操作系统到操作系统不等 .

  • 19

    我不能对* nix做太多评论但是,二进制文件的代码部分通常很乐意在任一环境中运行,但是操作系统对二进制文件提出了某些要求 . 在Windows中,您应该阅读PE Headers .

    第二部分仅仅是开发人员,很多时候代码部分将引用特定于操作系统的库 - 这就是为什么在编译成二进制文件之前可以同时拥有可移植和非可移植C代码的原因 .

  • 3

    程序需要知道如何调用操作系统服务 . 如何完成取决于操作系统:一些使用中断,一些使用x86 lcall 指令,一些(特别是Windows)具有区分共享库,而不记录如何直接调用服务 . 旧的680x0 Mac和一些其他680x0操作系统使用了保留指令集区域并捕获了由此产生的"invalid CPU opcode"异常 . 此外,即使机制相同,系统调用的顺序和参数格式也会在操作系统之间有所不同(有时是同一操作系统的不同版本;请参阅Linux内核中的 stat() ,以获取多次更改的接口示例) .

    如果Wine也支持OS / 2风格的LX .exe s,那么有一些能够处理其他操作系统的能力' conventions: FreeBSD has the 490776 which handles the Linux-specific kernel interface, NetBSD similarly has emulators for the system call formats of other operating systems using the same hardware (say, Ultrix on MIPS or OSF/1 on Alpha), Linux used to have iBCS2 to handle the UnixWare/SCO Unix kernel interface, Wine provides replacement shared libraries and a binary loader for PE-style Windows executables. (I don' t . 它可能会处理原始格式 .exe ;然后还有 .com 这是一个原始内存转储耳光头 . )即便如此,总是存在使用不同的约定某种格式,有时约定相似,足以需要提示的OS为如何处理它 . (例如,参见FreeBSD上的 bless . )

  • 3

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

    (你可能会认为,如果你的程序完全依赖于标准化的组件,例如C运行库,这就毫无意义 . 这在理论上是正确的 - 但对于大多数应用程序来说都是无关紧要的,因为它们被迫使用依赖于操作系统的东西) .

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

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

  • 1

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

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

  • 4

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

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

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

    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

相关问题