【问题标题】:Fat Mach-O Executable Multi-purpose?Fat Mach-O 可执行多用途?
【发布时间】:2017-07-19 06:36:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: executable mach-o


    【解决方案1】:

    是的,这是可能的,但几乎没有用。在我了解原因之前,先介绍一下创建方法:

    获取这个 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 捆绑在一起,它可以尝试加载。但是,除此之外,我想不出一个用例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      相关资源
      最近更新 更多