由于所有Linux发行版都使用相同的内核,那么它们的可执行二进制文件是否有区别呢?
如果有的话,主要区别是什么?或者这是否意味着我们可以构建一个通用的Linux可执行文件?
所有的Linux发行版都使用相同的二进制格式ELF,但仍然存在一些差异:
因此,如果您想要使程序在所有发行版上运行,您可能必须静态链接一个仅依赖于内核系统调用的版本,即使这样您也只能在指定的架构上运行。
如果您真的想在任何架构上运行程序,则必须为所有架构编译二进制文件,并使用shell脚本启动正确的二进制文件。
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旧版的Unix也使用COFF格式。你可能仍然可以在这种格式中找到古老时代的可执行文件。Linux仍然支持它(虽然我不知道它是否编译在当前的发行版中)。