ios - Cocoa Touch 框架不使用与位置无关的代码吗?
问题描述
我注意到,在使用 检查 Mach 标头时otool
,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 时遇到问题,因为他们的应用程序使用的框架没有使用与位置无关的代码(查看示例)。otool
这让我想知道,当似乎从来没有报告PIE
框架二进制文件的标志时,我应该如何检查我的框架是否使用与位置无关的代码?!它只报告应用程序二进制文件。
这让我很困惑。我希望有人能解释一下这个...
解决方案
从 <mach-o/loader.h>:
#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 没有。它们总是隐含的与位置无关。
推荐阅读
- angular - 如何在已经在真实服务器上运行的本地服务器上设置 Angular 项目?
- java - 休眠多个@OneToMany 关系在父关系中产生更多结果
- java - 如何在java中使用lambda表达式缩写数据处理代码?
- c - 如何向/从其他处理器发送/接收结构数组?
- asp.net-core - Entity Framework Core 不加载一些相关对象
- delphi - 如何将重载的类方法分配给匿名方法?
- angular8 - 下面的语法有什么区别吗?
- android - 加载程序抛出错误 2035:即使文件存在也找不到 URL
- php - 未定义的属性:视图内的 stdClass::$id
- sql-server - 我的数据库日志文件大小有问题