OSX ld:为什么pagezero_size在64b OSX上默认为4GB?

时间:2017-10-24 16:58:34

标签: macos x86-64 ld

这是一个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。)

1 个答案:

答案 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)
...