Fat Mach-O 可执行多用途?

Fat Mach-O Executable Multi-purpose?

我目前正在 Mac 上使用 Mach-O 可执行文件,我刚刚遇到一个问题,一个 Fat Mach-O 可执行文件可以有多个用途吗?例如

我能否拥有一个带有指定 2 个可执行文件的 Fat Header 的单个 Mach-O 可执行文件:

可执行文件 1:此可执行文件可以是动态库,允许在外部应用程序中加载其代码。

可执行文件 2:此可执行文件可以是允许它通过终端或作为应用程序独立启动的可执行文件。

我只是想知道,是否可以在一个 Mach-O 二进制文件中包含 2 个功能完全不同的可执行文件?

是的,这是可能的,但几乎没有用。在我了解原因之前,先了解如何创建一个:

拿这个 C 文件:

#ifdef __LP64__
int main(void)
#else
int derp(void)
#endif
{
    return 123;
}

将其编译为 64 位可执行文件和 32 位共享库:

gcc -o t t.c -Wall
gcc -m32 -o t.dylib -Wall t.c -shared

并将它们粉碎在一起:

lipo -create -output t.fat t t.dylib

现在,为什么这应该没有用?
因为每个架构只能使用一个二进制文件,而且您几乎无法控制使用哪个切片。
理论上,您可以在同一个胖二进制文件中拥有所有这些架构的切片:

  • i386
  • x86_64
  • x86_64h
  • armv6
  • armv6m
  • armv7
  • armv7s
  • armv7k
  • armv7m
  • arm64

所以你可以将可执行文件、dylib、链接器和内核扩展粉碎成一个胖二进制文件,但你很难从中得到任何有用的东西.
最大的问题是 OS 选择加载哪个切片。对于可执行文件,这将始终是与您 运行 使用的处理器最接近的匹配项。对于 dylib、dylinker 和 kexts,将首先确定它们将被加载到的进程是 32 位还是 64 位,但是一旦做出区分,你也会得到与你的 CPU的能力。

我想像在 Mac OS X 10.5 上,您可以将 64 位二进制文​​件与 32 位 kext 捆绑在一起,它可以尝试加载。但是,除此之外,我想不出一个用例。