binary - 理论上可以通用二进制格式吗?
问题描述
首先,这完全是一个理论问题,我认为这是完全不可能的。另外,我的意思是跨操作系统的“通用”,而不是跨处理器。为简单起见,我们假设 x86-64。我知道不同的操作系统使用不同的系统调用这一事实(例如,Linux 使用 int 0x80 和 Windows int 0x21 作为一个巨大的简化)。
例如,Windows 使用可移植可执行 (PE) 二进制格式,而 Linux(据我所知,还有 OSX,我对该操作系统并不熟悉)使用可执行和可链接格式 (ELF)。
现在; 为了便于讨论,让我们考虑一个由二进制、文本和数据组成的应用程序“x”。从理论上讲,是否有可能拥有一个独立于平台的二进制格式包装器,将这三个段标记为独立于操作系统?
*------------------*
| Universal Header |
|------------------|
| Libraries for |
| each OS the app |
| should run on |
|------------------|
| Binary Code |
*------------------*
我之所以问这个问题是因为我想知道理论上是否可以编写一个“容器”来自动检测操作系统,加载二进制应用程序并提供一个“适配器”库,它将对抽象库的调用转换为实际,依赖于操作系统的系统调用。我想象的类似于 JVM,但是没有 JITing/interpreting 进行,而是包装程序所做的只是加载和设置实际的二进制文件,顾名思义,它是二进制文件,以及标准化库,可自动将对其的调用转换为特定于操作系统的系统调用。如果可以使用通用二进制格式,您甚至可以发布多平台可执行文件。我不打算实际编码这个,我只是好奇这在理论上是否可行。
解决方案
推荐阅读
- css - 背景图像仅在 Edge 中显示截断
- batch-file - For 循环使用用户输入来组合文件 - 使用命令
- intellij-idea - GDSL 用于在注解中定义闭包的委托
- python - 创建新列但在熊猫中获得收入
- c - 部分不受信任的应用程序中的地址检查
- azure-functions - 使用 Azure 函数进行更新以挂接到 SignalR 广播
- android - 我的 Gradle 插件如何修改 AGP 7.0.0 的打包选项?
- r - 仅当尚未在列表中(来自多个数据集)时,如何将元素添加到列表中
- ios - 在 NSData 的 UnsafeRawPointer 上使用 deallocate 时内存泄漏?
- vue.js - 单个视图的Vue背景颜色