这是一个 OSX 链接器问题。我不认为 OSX(BSD 或 Mach 层)关心零页有多大或者它是否存在。我认为这是一个工具的事情。但这是我的意见,也是我提问的原因。
-pagezero_size 大小:默认情况下,链接器创建一个从地址零开始名为 __PAGEZERO 的不可读段。如果取消引用 NULL 指针,它的存在将导致总线错误。
这很清楚;它用于捕获 NULL 指针。在 32b OSX 系统上,段的大小为 4KB,这是系统页大小。但在当前的 64b 系统上,该段的大小增加到 4GB。为什么它不保持系统页面大小 4KB 或架构的最大页面大小 2MB?这意味着我根本无法使用 32b 绝对寻址。
使用此标志并覆盖默认值是否存在任何问题?苹果商店规定,...?
(此功能特定于 OSX ld64 链接器。该功能至少可以追溯到 2006 年 3 月 ld64-47.2。地址空间布局随机化和 64b 支持于 2007 年 10 月从 Leopard 开始。)
该-pagezero_size选项是链接器选项,而不是编译器选项。因此,当您使用编译器来驱动链接时,您需要将其传递为-Wl,-pagezero_size,0x1000(或任何您想要的大小)。这很好用。我是 Wine 项目的贡献者,该项目依赖于此来实现 64 位版本的兼容性。
我对为什么 64 位的默认零页大小为 4GB 的理解是为了捕获指针无意中存储在 32 位变量中并因此被截断的情况。当它最终被转换回指针时,它将位于低 4GB 中,因此无效。任何取消引用它的尝试都会导致访问冲突。
更新:
似乎它也-pagezero_size被认为是一个编译器选项,并且在我的测试中工作得很好。无论哪种方式,我都会得到一个正常运行的可执行文件并otool显示__PAGEZERO所需大小的段。
您使用什么版本的工具?我在 Sierra (10.12.6) 上使用 Xcode 8:
$ cc --version
Apple LLVM version 8.1.0 (clang-802.0.41)
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1745 次 |
| 最近记录: |