Linux 发行版之间的可执行二进制文件有什么区别吗?

Linux 发行版之间的可执行二进制文件有什么区别吗?,linux,kernel,Linux,Kernel,由于所有Linux发行版都使用相同的内核,它们的可执行二进制文件之间有什么区别吗 如果是,主要区别是什么?或者这是否意味着我们可以构建一个通用的linux可执行文件?几乎所有linux程序文件都使用该标准。所有linux端口(即不同处理器上的linux内核)都用作可执行文件和库的文件格式。一个特定的ELF二进制文件被标记为可以在其上运行的单个体系结构/操作系统(尽管某些操作系统具有从其他操作系统运行ELF二进制文件的兼容性) 大多数端口都支持旧格式。(有些处理器非常新,从来没有为它们提供过任何a

由于所有Linux发行版都使用相同的内核,它们的可执行二进制文件之间有什么区别吗


如果是,主要区别是什么?或者这是否意味着我们可以构建一个通用的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,但仍然存在一些差异:

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


    如果你真的想在任何拱门上运行一个程序,那么你必须为所有拱门编译二进制文件,并使用一个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*