一個64位的程式,是否能夠指定堆疊的起始地址為0x100000000,使得程式中的變數都分配在高于4G的記憶體中,也就是說變數的地址的高32位不為0,其目的是測驗程式中是否有地址高位被截斷的問題。
或者有沒有其他方法來測驗地址高位截斷問題?
開發環境為win10+VS2017
懇請大家指教!
uj5u.com熱心網友回復:
鏈接選項中指定/LARGEADDRESSAWAREuj5u.com熱心網友回復:
這個選項用來通知連接器應用程式可以處理大于2GB的地址,無法保證我程式內部的變數分配在高于4G的記憶體中
uj5u.com熱心網友回復:
記憶體由作業系統統一管理,不能隨意指定位置的。uj5u.com熱心網友回復:
是的呢,所以才來問問看有沒有什么特殊方法可以達到這個目的,只要保證變數地址的高32位不為0即可
uj5u.com熱心網友回復:
在支持ASLR的作業系統中,如果一個64位程式帶有LARGEADDRESSAWARE標志,windows加載程式會把它加載到4GB以上的隨機地址
uj5u.com熱心網友回復:
鏈接選項中指定/LARGEADDRESSAWARE
這個選項用來通知連接器應用程式可以處理大于2GB的地址,無法保證我程式內部的變數分配在高于4G的記憶體中
在支持ASLR的作業系統中,如果一個64位程式帶有LARGEADDRESSAWARE標志,windows加載程式會把它加載到4GB以上的隨機地址
謝謝,如果真是這樣確實可以達到我的目的,不過還想請教下,您的這個結論的出處是?我看MSDN上只提到enable這個設定,可以處理大于2GB的記憶體
uj5u.com熱心網友回復:
你試一下不就知道了嗎,“enable這個設定,可以處理大于2GB的記憶體”這是針對32位程式,64位程式本來就可以突破4GB地址空間限制,所以LARGEADDRESSAWARE就有了其他意義uj5u.com熱心網友回復:
堆疊底的地址最初是由誰決定的?編譯器嗎?還是以其它規則?uj5u.com熱心網友回復:
據說64位程式默認指定了LARGEADDRESSAWARE【x64下8T】32位程式默認沒指定LARGEADDRESSAWARE【2G】
http://fresky.github.io//2015/06/25/start-from-LAA/剛找的。文章給了MSDN但點進去發現沒了。感覺真實性還是有的
uj5u.com熱心網友回復:
但看堆疊空間以我目前的水平。int a;看看a的地址哇
uj5u.com熱心網友回復:
據說64位程式默認指定了LARGEADDRESSAWARE【x64下8T】
32位程式默認沒指定LARGEADDRESSAWARE【2G】
http://fresky.github.io//2015/06/25/start-from-LAA/剛找的。文章給了MSDN但點進去發現沒了。感覺真實性還是有的
是這樣的,64位應用默認是帶LARGEADDRESSAWARE標志的,除非鏈接時指定/LARGEADDRESSAWARE:NO。
對于沒有LARGEADDRESSAWARE標志的win64程式,windows加載程式會優先把它加載在低2GB地址范圍之內(如果可能的話)。
對于帶LARGEADDRESSAWARE標志的win64程式,有兩種情況
在不支持ASLR的作業系統中,優先加載到默認地址(對exe是0x140000000,dll是0x180000000,都是4GB以上的地址),但是如果程式鏈接時使用/fixed選項剝離了重定位資訊,windows會把它加載到pe檔案中指定的基地址
在支持ASLR的作業系統中,優先加載到4GB以上的隨機地址,如果程式鏈接時使用/dynamicbase:no選項,則按照不支持ASLR的情況加載
uj5u.com熱心網友回復:
Windows下,程式運行的堆疊起始地址是由作業系統加載程式時決定的。VS編譯、鏈接工具可以指定初始的堆疊大小,但不能指定堆疊的起始地址。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/22496.html
標籤:C++ 語言
上一篇:matlab程式
下一篇:如何用C語言實作自定義彈窗與選項
