在windows和linux上运行的程序

问题描述 投票:0回答:2

是否可以编写一个在 Windows 和 Linux 上运行而无需任何解释器的程序(使其可执行)?
它能够接受输入并将输出打印到控制台吗?
直接在硬件上运行的程序,纯机器代码,因为这在理论上应该是可能的

编辑:
好吧,文件格式不同,系统调用也不同
但是,对于内核开发人员来说,为了乐趣和科学而引入另一种名为 raw 的可执行格式有多困难或者有可能吗?也许原始程序无法返回报告,但它应该能够对 cpu 造成重负载并提高其温度,作为运行的证据

linux windows compilation
2个回答
1
投票

是否可以编写一个在 Windows 和 Linux 上运行而无需任何解释器的程序(使其可执行)?

在实践中,不会!

Levine 的书链接器和加载器解释了为什么在实践中这是不可能的。

在最新的 Linux 上,可执行文件具有 elf(5) 格式。

在 Windows 上,它有一些 PE 格式。

可执行文件的第一个字节是不同的。这两个操作系统有不同的系统调用。 Linux 的在 syscalls(2) 中列出。

甚至在 Linux 上,实际上,可执行文件通常是动态链接的,并且依赖于共享对象(并且它们在一个发行版与下一个发行版之间是不同的,因此为 Debian/Testing 构建的可执行文件很可能无法在红帽)。您可以使用 objdump(1)readelf(1)ldd(1) 命令来检查它,并使用 strace(1)gdb(1) 来观察其运行时行为。

软件的可移植性通常是通过使用一些“开源”许可证发布(以源代码形式)来实现的。那么重新编译的负担就落在了用户的肩上。 在实践中,真正的软件(特别是具有图形用户界面的软件)取决于许多操作系统特定和计算机特定资源(例如字体、屏幕尺寸、颜色)和用户偏好。

一种可能的方法是拥有一个小型操作系统特定软件库,它在运行时生成机器代码,例如

SBCL

LuaJit 可以。您也可以考虑使用asmjit。另一种方法是在运行时生成不透明或“混淆”的 C 或 C++ 代码,对其进行编译(使用系统编译器),然后在运行时将其作为“插件”加载。在 Linux 上,将 dlopen(3)dlsym(3) 一起使用。 Pitrat 的书:人工存在,有意识机器的良心描述了一个软件系统(某个人工数学家),它生成所有 C 源代码(五十万行)。

Wine 模拟器 允许您在 Linux 上运行一些(但不是全部)简单 Windows 可执行文件。据传,

WSL 层

可以让您在 Windows 上运行一些 Linux 可执行文件。 PS。即使像RefPerSysGCC

Qt

这样的开源项目也可能(并且通常)很难构建。 不,主要是因为可执行格式不同,但是... 只要小心一点,您就可以使用几乎相同的代码来创建不同的可执行文件,一个用于 Linux,另一个用于 Windows。根据您的考虑,解释器 Java 也可以在 Windows 和 Linux 上运行(尽管在 Java 虚拟机中)。


1
投票

您可能需要 Windows 用户在

WSL

上运行,这可能是一个丑陋的解决方法,但允许您为 Windows 和 Linux 用户拥有相同的可执行文件。

© www.soinside.com 2019 - 2024. All rights reserved.