【问题标题】:Is there any difference between executable binary files between distributions?发行版之间的可执行二进制文件有什么区别吗?
【发布时间】:2010-11-05 00:57:02
【问题描述】:

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

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

【问题讨论】:

  • “关于 linux 二进制文件的一些事情” - 花几秒钟改进这个问题摘要怎么样?
  • 您可以随时编辑其他人的标题/问题 - 但请谨慎操作!
  • 你的意思是通用的跨Linux发行版还是跨各种架构...?

标签: linux kernel


【解决方案1】:

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

大多数端口都支持旧的a.out 格式。 (有些处理器足够新,以至于从来没有任何 a.out 可执行文件可供它们使用。)

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

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


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

可以为其他架构的可执行文件注册binfmt_misc,以使用qemu-user 运行。

理论上,可以为胖二进制文件创建一种新格式——也许在 ELF 中注册一个新的“架构”。然后内核binfmt 加载器必须了解这种新格式,并且您不会想错过ld-linux.so 动态链接器和整个构建工具链。很少有人对这样的功能感兴趣,据我所知,没有人在研究类似的东西。

【讨论】:

  • 有没有办法在运行时列出所有可执行格式,例如cat /proc/binfmt?我只能用ls /proc/sys/fs/binfmt_misc 列出binfmt_misc。我现在最好的是源代码树上的ls fs/binfmt*
【解决方案2】:

如果您想创建一个运行所有 Linux 发行版的程序,您可以考虑使用脚本语言(如PythonPerl)或独立于平台的编程语言 喜欢Java

用脚本语言编写的程序在执行时编译,这意味着它们总是被编译以匹配它们执行的平台,因此应该总是工作(假设库设置正确)。

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

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

许多用PythonPerl编写的程序也是如此;但是,PythonPerl 程序能否在其他操作系统上运行取决于该程序使用的库以及这些库是否在其他操作系统上可用。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • Linux 直接从 a.out 跳到 ELF。一些端口可以将 kernel 映像构建为 ECOFF 格式(MIPS、PowerPC)以与某些引导加载程序兼容,并且 Alpha 可能具有 COFF 加载支持以与非本机可执行文件兼容,但我找不到在现代 Linux 内核的源代码中对其有任何进一步的痕迹。
    【解决方案4】:

    所有 Linux 发行版都使用相同的二进制格式 ELF,但还是有一些区别:

    1. 不同的 cpu 架构使用不同的指令集。
    2. 同一个cpu arch可能使用不同的ABI,ABI定义了如何使用寄存器文件,如何调用/返回一个例程。不同的 ABI 不能一起工作。
    3. 即使在相同的架构、相同的 ABI 上,这仍然不意味着我们可以将分发中的一个二进制文件复制到另一个。由于大多数二进制文件不是静态链接的,所以它们依赖于发行版下的库,这意味着不同发行版可能使用不同版本或不同编译配置的库。

    因此,如果您希望您的程序在所有发行版上运行,您可能必须静态链接仅依赖于内核系统调用的版本,即使这样您也只能运行指定的架构。

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

    【讨论】:

    • 很好的答案,谢谢!它使问题更清楚
    【解决方案5】:

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

    【讨论】:

    • 我们可以改变二进制文件的 ELF 吗?
    猜你喜欢
    • 2018-07-02
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2013-05-16
    相关资源
    最近更新 更多