2017-07-19 28 views
0

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

我可以有一个胖头指定2个可执行单一的Mach-O可执行文件:

可执行1:此可执行文件可能是一个动态库,允许外部应用程序被加载其代码。

可执行2:此可执行文件可能是一个可执行文件允许其通过终端或应用程序可以独立启动。

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

回答

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,接头和内核扩展成一个二进制的脂肪,但是你有一个很难得到任何有用的东西出来呢。
最大的问题是操作系统选择加载哪个片。对于可执行文件,这将永远是您运行的处理器最接近的匹配项。对于dylibs,dylinkers和kexts,首先要确定它们要加载到的进程是32位还是64位,但一旦进行了区分,您就会得到最接近CPU的切片能力。

我想象一下,在Mac OS X 10.5上,你可能会有一个64位的二进制文件捆绑了一个32位的kext,它可以尝试加载。然而,除此之外,我想不出一个用例。