Linux 发行版之间的可执行二进制文件有什么区别吗?
由于所有Linux发行版都使用相同的内核,它们的可执行二进制文件之间有什么区别吗Linux 发行版之间的可执行二进制文件有什么区别吗?,linux,kernel,Linux,Kernel,由于所有Linux发行版都使用相同的内核,它们的可执行二进制文件之间有什么区别吗 如果是,主要区别是什么?或者这是否意味着我们可以构建一个通用的linux可执行文件?几乎所有linux程序文件都使用该标准。所有linux端口(即不同处理器上的linux内核)都用作可执行文件和库的文件格式。一个特定的ELF二进制文件被标记为可以在其上运行的单个体系结构/操作系统(尽管某些操作系统具有从其他操作系统运行ELF二进制文件的兼容性) 大多数端口都支持旧格式。(有些处理器非常新,从来没有为它们提供过任何a
如果是,主要区别是什么?或者这是否意味着我们可以构建一个通用的linux可执行文件?几乎所有linux程序文件都使用该标准。所有linux端口(即不同处理器上的linux内核)都用作可执行文件和库的文件格式。一个特定的ELF二进制文件被标记为可以在其上运行的单个体系结构/操作系统(尽管某些操作系统具有从其他操作系统运行ELF二进制文件的兼容性) 大多数端口都支持旧格式。(有些处理器非常新,从来没有为它们提供过任何a.out可执行文件。) 一些端口还支持其他可执行文件格式;例如,PA-RISC端口支持HP-UX的旧可执行文件,而μcLinux(非MU)端口支持它们自己的平面格式 Linux也有,它允许用户空间为任意二进制格式注册处理程序。一些发行版利用这一点来执行Windows、.NET或Java应用程序——它实际上仍在启动解释器,但对用户来说是完全透明的
Alpha上的Linux支持加载通过
em86
emulator运行的英特尔二进制文件
可以为其他体系结构的可执行文件注册binfmt\u misc
,以便与一起运行
理论上,我们可以为fat二进制文件创建一种新格式——也许可以在ELF中注册一种新的“架构”。然后内核
binfmt
loader必须学习这种新格式,并且您不会想错过ld linux.so
dynamic linker和整个构建工具链。人们对这样一个功能几乎不感兴趣,据我所知,没有人在开发类似的功能。所有Linux发行版都使用相同的二进制格式ELF,但仍然存在一些差异:
如果你真的想在任何拱门上运行一个程序,那么你必须为所有拱门编译二进制文件,并使用一个shell脚本来启动正确的程序。旧unix也使用这种格式。您仍然可以找到以前的可执行文件的这种格式。Linux仍然支持它(虽然我不知道它是在当前的DistROS中编译的)。 < P>如果你想创建一个运行所有Linux发行版的程序,你可以考虑使用<强>脚本语言<强>(比如<代码> Python < /Cord>和<代码> Perl )或者是一种与平台无关的编程语言,比如
Java
用脚本语言编写的程序在执行时被编译,这意味着它们总是被编译为与在其上执行的平台相匹配,因此应该始终工作(假定库设置正确)
另一方面,用Java
编写的程序在发布之前会进行编译,但只要安装了Java虚拟机,就可以在任何Linux发行版上执行
此外,用Java
编写的程序可以在其他操作系统上运行,如MS-Windows
和Mac-OS
许多用
Python
和Perl
编写的程序也是如此;但是,一个Python
或Perl
程序是否能在另一个操作系统上工作,取决于该程序使用的库以及这些库在其他操作系统上是否可用。“关于linux二进制文件的一些信息”-再花几秒钟改进一下这个问题摘要如何?您可以随时编辑其他人的标题/问题-尽管请小心操作!你是说linux发行版上的universal accross还是各种架构上的accross…?回答得好,谢谢!它更清楚地说明了Linux直接从a.out跳到ELF的问题。一些端口可以将内核映像构建为ECOFF格式(MIPS、PowerPC),以便与某些引导加载程序兼容,Alpha可能具有COFF加载支持,以便与非本机可执行文件兼容,但是我在现代Linux内核的源代码中找不到它的任何进一步的痕迹。我们可以改变二进制文件的ELF吗?有没有办法在运行时列出所有可执行格式,例如,cat/proc/binfmt
?我只能列出带有ls/proc/sys/fs/binfmt\u misc
的binfmt\u misc。我现在拥有的最好的工具是源代码树上的ls fs/binfmt*
。