【问题标题】:Do Cocoa Touch frameworks not use position-independent code?Cocoa Touch 框架不使用与位置无关的代码吗?
【发布时间】:2019-09-17 18:56:59
【问题描述】:

我注意到,在使用otool 检查 Mach 标头时,Cocoa Touch 框架从未设置过PIE 标志,尽管我已经设置了“生成位置相关的可执行文件”和“生成位置相关的代码”在 Xcode 中为 NO。不过,这是我从otool 得到的输出:

otool -hv framework_binary
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64   ARM64        ALL  0x00       DYLIB    16       1560   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS    

如您所见,PIE 标志不存在。但是,在检查应用程序二进制文件时,PIE 现在就在那里:

otool -hv application_binary
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64   ARM64        ALL  0x00     EXECUTE    24       3088   NOUNDEFS DYLDLINK TWOLEVEL PIE

谁能解释一下?

我读过很多人在将他们的应用程序上传到 App Store 时遇到问题,因为他们的应用程序使用的框架没有使用与位置无关的代码(例如,请查看 here)。这让我想知道当otool 似乎从未报告框架二进制文件的PIE 标志时,我应该如何检查我的框架是否使用与位置无关的代码?!它只报告应用程序二进制文件。

这让我很困惑。我希望有人能解释一下...

【问题讨论】:

    标签: ios xcode dylib ios-frameworks fpic


    【解决方案1】:

    来自

    #define MH_PIE 0x200000         /* When this bit is set, the OS will
                           load the main executable at a
                           random address.  Only used in
                           MH_EXECUTE filetypes. */
    

    注意:“仅用于 MH_EXECUTE 文件类型。”

    只有可执行文件具有 PIE/非 PIE 区别。 Dylibs 和 bundles 没有。它们总是隐式的与位置无关。

    【讨论】:

    • 谢谢,但如果 dylibs 总是隐含的位置无关,为什么有些应用程序会被 App Store 拒绝,而 Apple 明确表示嵌入在应用程序包中的框架不是 PIE?例如:github.com/realm/realm-cocoa/issues/3710 Apple 拒绝了一个应用程序,因为它的一些嵌入式框架没有使用 PIE。所以看起来框架确实也可以是非 PIE 的,不是吗?
    猜你喜欢
    • 2015-03-18
    • 2014-11-12
    • 2017-03-26
    • 2018-02-02
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    相关资源
    最近更新 更多