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

Mic*_*ine 10 linux kernel

由于所有Linux发行版使用相同的内核,它们的可执行二进制文件之间是否有任何区别?

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

Sam*_*iao 14

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

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

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

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


eph*_*ent 13

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

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

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

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


Linux on Alpha支持加载通过em86仿真器运行的Intel二进制文件.

可以注册binfmt_misc其他体系结构的可执行文件,以便与qemu-user一起运行.

理论上,人们可以创建一种新的格式 - 也许在ELF中注册一个新的"架构" - 用于胖二进制文件.然后binfmt必须教会内核加载器有关这种新格式,并且您不希望错过ld-linux.so动态链接器和整个构建工具链.对这样的功能一点兴趣,据我所知,没有人在做类似的事情.