由于所有Linux发行版使用相同的内核,它们的可执行二进制文件之间是否存在差异?

如果是,主要区别是什么?或者这是否意味着我们可以构建一个通用的linux可执行文件?

有帮助吗?

解决方案

所有Linux发行版使用相同的二进制格式ELF,但仍然存在一些差异:

  1. 不同的cpu arch使用不同的指令集。
  2. 相同的cpu arch可能使用不同的ABI,ABI定义了如何使用寄存器文件,如何调用/返回例程。不同的ABI不能一起工作。
  3. 即使在同一个拱门上,同样的ABI,这仍然不意味着我们可以将分发中的一个二进制文件复制到另一个。由于大多数二进制文件不是静态链接的,因此它们依赖于分发下的库,这意味着不同的分发可能使用不同的版本或不同的库编译配置。
  4. 因此,如果您希望程序在所有发行版上运行,则可能必须静态链接仅依赖于内核系统调用的版本,即使这样您只能运行指定的arch。

    如果你真的想在任何拱门上运行程序,那么你必须为所有的拱门编译二进制文件,并使用shell脚本启动正确的程序。

其他提示

所有Linux端口(即不同处理器上的Linux内核)都使用 ELF 作为可执行文件和库的文件格式。特定的ELF二进制文件标记有可以运行的单一体系结构/ OS(尽管某些操作系统具有从其他操作系统运行ELF二进制文件的兼容性)。

大多数端口都支持较旧的 a.out 格式。 (有些处理器足够新,以至于从未存在任何a.out可执行文件。)

某些端口也支持其他可执行文件格式;例如,PA-RISC端口支持HP-UX的旧 SOM 可执行文件,μ cLinux(nonmmu)端口支持自己的FLAT格式。

Linux还有 binfmt_misc ,它允许用户空间为任意二进制格式注册处理程序。一些发行版利用它来执行Windows,.NET或Java应用程序 - 它实际上仍在启动解释器,但它对用户完全透明。


Linux on Alpha支持加载英特尔二进制文件,这些二进制文件通过 em86 模拟器运行。

可以为其他体系结构的可执行文件注册 binfmt_misc ,以便与 qemu-一起运行用户

理论上,人们可以创建一种新的格式 - 也许可以注册一种新的“架构”。在ELF中 - 对于胖二进制文件。然后必须教这个新格式的内核 binfmt 加载器,你不想错过 ld-linux.so 动态链接器和整个构建工具链。对这样的功能一点兴趣,据我所知,没有人在做类似的事情。

几乎所有Linux程序文件都使用 ELF 标准。

旧Unix还使用 COFF 格式。您仍然可以在此格式中找到以前的可执行文件。 Linux仍然支持它(我不知道它是否在当前的发行版中编译)。

如果要创建运行所有Linux发行版的程序,可以考虑使用脚本语言(如 Python Perl )或平台独立编程语言,如 Java

用脚本语言编写的程序在执行时编译,这意味着它们总是被编译为与它们执行的平台相匹配,因此应该始终有效(假设库已正确设置)。

另一方面,用 Java 编写的程序在分发之前进行编译,但只要安装了Java VM,就可以在任何Linux发行版上执行。

此外,用 Java 编写的程序可以在其他操作系统上运行,如 MS Windows Mac OS

对于用 Python Perl 编写的许多程序也是如此;但是, Python Perl 程序是否可以在另一个操作系统上运行,取决于该程序使用的库以及这些库是否可用于其他操作系统。 / p>

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top