ios - Cocoa Touch 框架不使用与位置无关的代码吗?

标签 ios xcode dylib ios-frameworks fpic

我注意到,当使用 otool 检查 Mach header 时,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 标志时,我应该如何检查我的框架是否使用位置无关代码?!它仅报告应用程序二进制文件。

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

最佳答案

来自:

#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 区别。 Dylib 和 bundle 则不然。它们始终隐式地与位置无关。

关于ios - Cocoa Touch 框架不使用与位置无关的代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57980449/

相关文章:

ios - 如何在 iOS 中水平居中 UITextView 内容,但不使用对齐中心?

ios - OS X : convert . dylib 到 .a/.o(动态到静态)?

ios - AFNetworking 3.0 和使用 setSessionDidReceiveAuthenticationChallengeBlock 的 SSL 身份验证

ios - Cocoa-Touch:如何查看两个 NSDate 是否在同一天?

ios - 如何将标签栏添加到表格 View 而不是详细 View

iphone - 如何使用 iPhone sdk 在 iPhone 应用程序中启用文件共享

ios - 如何在 Swift 中获取 C 指针的原始值?

ios - Xcode ipa 在 iOS 5.1 上安装,但在 iOS 5.1.1 上失败

objective-c - 从 dlsym() 返回值的函数?

c - 使用 clang 从命令行链接 .dylib 库