簡體   English   中英

OSX ld:為什么pagezero_size在64b OSX上默認為4GB?

[英]OSX ld: why does pagezero_size default to 4GB on 64b OSX?

這是一個OSX鏈接器問題。 我不認為OSX(BSD或Mach層)關心零頁面的大小,甚至是否存在。 我認為這是一個工具。 但這是我的意見,這就是我要問的原因。

-pagezero_size size:默認情況下,鏈接器會創建一個從名為__PAGEZERO的地址零開始的不可讀段。 如果取消引用NULL指針,它的存在將導致總線錯誤。

這很清楚; 它用於捕獲NULL ptrs。 在32b OSX系統上,段的大小為4KB,即系統頁面大小。 但是在目前的64b系統上,這個細分市場的規模增加到了4GB。 為什么它不在系統頁面大小4KB或架構的最大頁面大小,2MB? 這意味着我根本不能使用32b絕對尋址。

使用此標志並覆蓋默認值是否有任何問題? Apple Store規則,...?

(此功能特定於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)
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM