[英]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.