我目前正在Mac上使用Mach-O可执行文件,我遇到一个问题,一个Fat Mach-O可执行文件可以有多个用途吗?例如
我是否可以使用Fat Header指定2个可执行文件的单个Mach-O可执行文件:
可执行文件1:此可执行文件可以是动态库,允许其代码加载到外部应用程序中。
和
可执行文件2:此可执行文件可以是一个可执行文件,允许它通过终端或作为应用程序独立启动。
我只想知道,在单个Mach-O二进制文件中是否可以拥有2个具有完全不同功能的可执行文件?
答案 0 :(得分: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
现在,为什么这应该没用? 因为每个体系结构限制为一个二进制文件,并且您几乎无法控制使用哪个切片 从理论上讲,您可以在同一个胖二进制文件中为所有这些体系结构创建切片:
所以你可以将可执行文件,dylib,链接器和内核扩展粉碎成一个胖二进制文件,但是你很难从中获得任何有用的东西。
最大的问题是操作系统选择加载哪个切片。对于可执行文件,它将始终与您正在运行的处理器最匹配。对于dylibs,dylinkers和kexts,首先要确定它们要加载的进程是32位还是64位,但是一旦进行了区分,你也会得到最接近你的CPU的切片。能力。
我想回到Mac OS X 10.5上你可能有一个64位二进制文件捆绑了32位kext它可以尝试加载。但是,除此之外我无法想到一个用例。