gpt4 book ai didi

macos - OSX ld : why does pagezero_size default to 4GB on 64b OSX?

转载 作者:行者123 更新时间:2023-12-01 07:05:54 27 4
gpt4 key购买 nike

这是一个 OSX 链接器问题。我不认为 OSX(BSD 或 Mach 层)在乎零页有多大,或者它是否真的存在。我认为这是一个工具的事情。但这是我的意见,这就是我问的原因。

-pagezero_size size:默认情况下,链接器创建一个从地址 0 开始的不可读段,名为 __PAGEZERO。如果取消引用 NULL 指针,它的存在将导致总线错误。

这很清楚;它用于捕获 NULL ptr。在 32b OSX 系统上,段的大小是 4KB,这是系统页面大小。但是在当前的 64b 系统上,该段的大小增加到 4GB。为什么它不保持在系统页面大小 4KB 或体系结构的最大页面大小,2MB?这意味着我根本不能使用 32b 绝对寻址。

使用此标志并覆盖默认值有什么问题吗? Apple Store 规则,...?

(此功能特定于 OSX ld64 链接器。该功能至少可以追溯到 2006 年 3 月的 ld64-47.2。地址空间布局随机化和 64b 支持于 2007 年 10 月从 Leopard 开始。)

最佳答案

-pagezero_size option 是链接器选项,而不是编译器选项。所以,当你使用编译器来驱动链接时,你需要把它作为 -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)
...

关于macos - OSX ld : why does pagezero_size default to 4GB on 64b OSX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46916112/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com