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

11

由于所有Linux发行版都使用相同的内核,那么它们的可执行二进制文件是否有区别呢?

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


关于Linux二进制文件的一些内容 - 花几秒钟时间改进这个问题摘要怎么样? - scobi
你可以随时编辑别人的标题/问题-但请小心操作! - Martin Beckett
你的意思是在Linux发行版之间通用还是在不同架构之间通用? - LB40
5个回答

16

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

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

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

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


好的回答,谢谢!它让问题更加清晰明了。 - Mickey Shine

15
所有Linux端口(即不同处理器上的Linux内核)都使用ELF作为可执行文件和库的文件格式。特定的ELF二进制文件标记有一个可以运行它的单个架构/操作系统(尽管一些操作系统具有兼容性,可以运行来自其他操作系统的ELF二进制文件)。
大多数端口都支持较旧的a.out格式。(有些处理器是足够新的,以至于从未存在过任何a.out可执行文件。)
一些端口还支持其他可执行文件格式;例如,PA-RISC端口支持HP-UX的旧SOM可执行文件,而μcLinux(nonmmu)端口支持自己的FLAT格式。
Linux还有binfmt_misc,它允许用户空间注册处理程序以用于任意二进制格式。一些发行版利用这一点来能够执行Windows、.NET或Java应用程序--实际上仍然是启动解释器,但对用户完全透明。

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

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

理论上,可以创建一个新格式——也许在ELF中注册一个新的“架构”——用于fat二进制文件。然后内核binfmt加载器就必须学会如何处理这种新格式,并且还需要整个构建工具链,包括ld-linux.so动态链接器。但是对于这种功能几乎没有人感兴趣,据我所知,也没有人在开发类似的功能。


有没有一种方法在运行时列出所有可执行格式,例如 cat /proc/binfmt?我只能通过 ls /proc/sys/fs/binfmt_misc 列出 binfmt_misc。目前最好的办法是在源代码树上使用 ls fs/binfmt* - Ciro Santilli OurBigBook.com

1
如果您想创建一个在所有Linux发行版上运行的程序,可以考虑使用脚本语言(如Python和Perl)或者跨平台的编程语言,例如Java。
使用脚本语言编写的程序会在执行时编译,这意味着它们总是被编译以匹配它们所在的平台,因此只要库设置正确,它们就应该始终可以工作。
另一方面,使用Java编写的程序在分发之前就被编译,只要安装了Java虚拟机,它们就可以在任何Linux发行版上运行。
此外,使用Java编写的程序可以在其他操作系统上运行,例如MS Windows和Mac OS。
许多使用Python和Perl编写的程序也是如此,但是它们是否能在其他操作系统上运行取决于该程序使用的库以及这些库是否在其他操作系统上可用。

1

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


我们能否以某种方式更改二进制文件的ELF格式? - Muneeb Zulfiqar

1

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


1
Linux直接从a.out跳过到ELF。一些端口可以将内核映像构建为ECOFF格式(MIPS,PowerPC),以便与某些引导加载程序兼容,而Alpha可能具有COFF加载支持,以便与非本机可执行文件兼容,但我在现代Linux内核源中找不到任何进一步的迹象。 - ephemient

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接