这是一个OSX链接器问题。我不认为OSX(BSD或Mach层)关心零页面的大小,甚至是否存在。我认为这是一个工具。但那是我的意见,这就是我要问的原因。
-pagezer__size size:默认情况下,链接器会创建一个从名为__PAGEZERO的地址0开始的不可读段。如果取消引用NULL指针,它的存在将导致总线错误。
这很清楚;它用于捕获NULL ptrs。在32b OSX系统上,段的大小为4KB,即系统页面大小。但是在目前的64b系统上,这个细分市场的规模增加到了4GB。为什么它不会留在4KB的系统页面大小或架构的最大页面大小,2MB?这意味着我根本不能使用32b绝对寻址。
使用此标志并覆盖默认值是否有任何问题? Apple Store规则,......?
(此功能特定于OSX ld64链接器。该功能的日期至少为2006年3月的ld64-47.2。地址空间布局随机化和64b支持从2007年10月开始使用Leopard。)
答案 0 :(得分:2)
-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)
...