由于所有Linux发行版使用相同的内核,它们的可执行二进制文件之间是否存在差异?
如果是,主要区别是什么?或者这是否意味着我们可以构建一个通用的linux可执行文件?
答案 0 :(得分:13)
所有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
模拟器运行的英特尔二进制文件。
可以为qemu-user运行其他体系结构的可执行文件注册binfmt_misc
。
理论上,人们可以创建一种新的格式 - 也许在ELF中注册一个新的“架构” - 用于胖二进制文件。然后必须教这个新格式的内核binfmt
加载器,你不想错过ld-linux.so
动态链接器和整个构建工具链。对这样的功能一点兴趣,据我所知,没有人在做类似的事情。
答案 1 :(得分:13)
所有Linux发行版使用相同的二进制格式ELF,但仍然存在一些差异:
因此,如果您希望程序在所有发行版上运行,则可能必须静态链接仅依赖于内核系统调用的版本,即使这样您只能运行指定的arch。
如果你真的想在任何拱门上运行程序,那么你必须为所有的拱门编译二进制文件,并使用shell脚本来启动正确的程序。
答案 2 :(得分:1)
几乎所有Linux程序文件都使用ELF标准。
答案 3 :(得分:1)
旧Unix也使用COFF格式。您仍然可以在此格式中找到以前的可执行文件。 Linux仍然支持它(我不知道它是否在当前的发行版中编译)。
答案 4 :(得分:1)
如果要创建运行所有Linux发行版的程序,可以考虑使用脚本语言(如Python
和Perl
)或平台独立编程语言,如Java
。
用脚本语言编写的程序在执行时编译,这意味着它们总是被编译为与它们执行的平台相匹配,因此应该始终有效(假设库已正确设置)。
另一方面,用Java
编写的程序在分发之前编译,但只要安装了Java VM,就可以在任何Linux发行版上执行。
此外,用Java
编写的程序可以在MS Windows
和Mac OS
等其他操作系统上运行。
用Python
和Perl
编写的许多程序也是如此;但是,Python
或Perl
程序是否适用于另一个操作系统取决于该程序使用的库以及这些库是否可用于其他操作系统。