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

Ols*_*ist 5 macos x86-64 ld

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

Ken*_*ses 5

-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)