[問題] 宣告的記憶體位址在windos跟linux差異

看板C_and_CPP作者 (下雨的晚上)時間11年前 (2012/09/05 15:59), 編輯推噓24(25130)
留言56則, 23人參與, 最新討論串1/3 (看更多)
剛剛我在上課,老師講了一個東西讓我非常困惑不已... 因為我非本科系出身,只是對寫程式很有興趣去自修的, 對指標、記憶體位址有基本的認識,然後剛剛老師在suse下用Anjuta在講c的指標 就隨便寫了一個很簡單的內容: int x=77; printf("%p", &x); > 0x7fff4c64a0ac 秀出位址給我們看,然後就把秀出來的位址 0x7fff4c64a0ac 複製回程式裡... printf("%d", *((int*)0x7fff4c64a0ac)); 打算直接叫出位址裡的東西給我們看... 當下我疑問就很大,不是每次宣告的時候,系統才配發給我們位址嗎? 想當然是失敗了,不過老師卻很肯定只要程式沒更動,每次執行就會拿到同樣的位址, 所以他回到windos用devcpp寫了一樣的程式碼, 但這次就真的是每次執行,拿到x的位址就都是一樣了, 把位址寫死可以去拿到x的值... 於是老師就說可能是os的演算法有差異造成的... 可是我又問說這樣很奇怪,如果說我這樣把位址寫死, 拿到另一台電腦上執行不會有問題嗎? 老師卻說不會... 這樣我疑問很大啊,怎麼可能每次位址都一樣?? 可是在windos底下的情況的確又是這樣, 想請問各位前輩到底是什麼情況呢?? -- 真理和公平的界定是那麼模糊 道理不道理要怎麼說才能清楚 在匆忙的世界我們走自己的路 努力的追逐那其實退步的進步 路上的風景經過了也就不在乎 黃玠 我們都該學習 什麼是滿足 拾荒地圖 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.171.209.198

09/05 16:17, , 1F
請教一下是哪邊的老師?
09/05 16:17, 1F

09/05 16:18, , 2F
Windows 按照預設值,每次都會把執行檔載入到同個位址,
09/05 16:18, 2F

09/05 16:20, , 3F
假設 4000 好了,而區域變數 x 通常位址固定在某個相對
09/05 16:20, 3F

09/05 16:21, , 4F
距離,比如固定隔 4 位元組,所以位址不變是有可能的
09/05 16:21, 4F

09/05 16:22, , 5F
當然你必須每次都把 int x 放在第一個函數 main 裡,才行
09/05 16:22, 5F

09/05 16:25, , 6F
你們老師東西只教一半,虛擬位址、物理位址、stack frame
09/05 16:25, 6F

09/05 16:26, , 7F
這些如果沒先講過,那他扯這些,完全只會誤導別人而已
09/05 16:26, 7F

09/05 16:28, , 8F
改問你們老師教的是什麼科目?
09/05 16:28, 8F
嗯...大概知道答案了,感謝大家~ 我只是想找答案而已,至於老師我不想多說= =" 根據老師自己的說法也是非本科系啦,但據他本人言寫了不下10年的code 因為是職訓的課程,時間很短,教的東西很雜 所以我猜他大概也不想講的很細吧... 只是有時候寫程式的邏輯連我都覺得怪怪的就是了........

09/05 17:00, , 9F
剛用VC測 變數記憶體位置每次都不一樣
09/05 17:00, 9F

09/05 17:07, , 10F
現在的OS都有address space layout randomization
09/05 17:07, 10F

09/05 17:09, , 11F
所以同一套說法現在已經不管用了
09/05 17:09, 11F

09/05 17:10, , 12F
這種事情研究練習玩玩就好,別在實務上使用啊…
09/05 17:10, 12F

09/05 17:10, , 13F
糟糕我不小心按到噓
09/05 17:10, 13F

09/05 17:11, , 14F
幫好人推回來
09/05 17:11, 14F

09/05 17:27, , 15F
感謝補 li 大補充。剛用 cl aslr.c 編譯。執行檔在 Win7
09/05 17:27, 15F

09/05 17:27, , 16F
位址會變,在 XP 跑不會。應該是 VISTA 後才支援。
09/05 17:27, 16F

09/05 17:28, , 17F
cl aslr.c /link /DYNAMICBASE:NO 這樣編譯,就能關掉選項
09/05 17:28, 17F

09/05 19:10, , 18F
看過十年經驗的程式設計師寫出大一大二等級的程式
09/05 19:10, 18F

09/05 20:20, , 19F
哇靠這是哪的老師,害人啊…
09/05 20:20, 19F

09/05 20:48, , 20F
<--大二程度
09/05 20:48, 20F

09/05 20:56, , 21F
樓上是十年經驗設計師(_m_)
09/05 20:56, 21F

09/05 21:04, , 22F
只是五年的設計師...而且想轉跑道了! 寫不出什麼了
09/05 21:04, 22F

09/05 21:23, , 23F
我上司號稱寫五年C++,連刪除物件會呼叫dtor都會忘記
09/05 21:23, 23F

09/05 21:49, , 24F
<--不會c++
09/05 21:49, 24F

09/05 21:56, , 25F
<--只會++c
09/05 21:56, 25F

09/05 22:06, , 26F
複製回程式裡那行要看東西怎不是用%d 那是indirect不是嗎
09/05 22:06, 26F

09/05 22:21, , 27F
過了好久,補個推XD
09/05 22:21, 27F

09/05 22:44, , 28F
推 b9307025,我也覺得是 %x
09/05 22:44, 28F
抱歉,是我打錯了 是%d沒錯~"~ ※ 編輯: NullLife 來自: 123.193.204.107 (09/05 22:48)

09/05 23:27, , 29F
這種課不上也罷...
09/05 23:27, 29F

09/05 23:32, , 30F
我突然想起某個面試題...
09/05 23:32, 30F

09/05 23:39, , 31F
感覺這老師只是在賣弄技巧,而且技巧也.....
09/05 23:39, 31F

09/06 01:20, , 32F
我也寫了十年的程式呀,只不過是寫一年,重複十次而已
09/06 01:20, 32F

09/06 01:40, , 33F
ASLR?
09/06 01:40, 33F

09/06 01:44, , 34F
事實擺明了,在Linux就不是這樣子,卻硬要以自己的認知講故事
09/06 01:44, 34F

09/06 01:57, , 35F

09/06 01:57, , 36F
看這個比較營養
09/06 01:57, 36F

09/06 05:25, , 37F
... 這太超過,無法說明原理的東西不如別教 :(
09/06 05:25, 37F

09/06 10:48, , 38F
還好吧?師父告訴你有這個東西,之後把它學好就是學生的
09/06 10:48, 38F

09/06 10:48, , 39F
責任了,像酒劍仙也沒有教李消遙教到學會劍神才離開
09/06 10:48, 39F

09/06 10:50, , 40F
他只有教御劍術耶,根本不能打後面的王呀,會不會太超過?
09/06 10:50, 40F

09/06 11:18, , 41F
to 二樓: 區域變數的位址不會固定相對於執行檔載入位址
09/06 11:18, 41F

09/06 11:27, , 42F
應該說配在 stack 上的和 image base 無關, 那種有相對關
09/06 11:27, 42F

09/06 11:28, , 43F
係的是 static variable
09/06 11:28, 43F

09/06 12:21, , 44F
我的意思是 int main 的第一個區域變數 x 是會固定
09/06 12:21, 44F

09/06 12:33, , 45F
http://tinyurl.com/d3z53lq 就這張圖來說吧,其右下角的
09/06 12:33, 45F

09/06 12:33, , 46F
call stack 一直到 main 每次執行都不會改變,再加上 ASLR
09/06 12:33, 46F

09/06 12:34, , 47F
不開啟的情況下,每次的 ebp 值都會一樣,所以 &x 這個位
09/06 12:34, 47F

09/06 12:35, , 48F
址,在這種情況下,跟 image base 是有固定相對距離的
09/06 12:35, 48F

09/06 13:42, , 49F
這在保證每次執行檔載入位址固定、ESP 起始位址固定是成
09/06 13:42, 49F

09/06 13:44, , 50F
立沒錯,但就連限定 Windows 平台時都還是要系統版本以及
09/06 13:44, 50F

09/06 13:44, , 51F
編譯器設定配合才能滿足這個前提,我是傾向不這樣假設啦
09/06 13:44, 51F

09/06 16:52, , 52F
推樓上二位的討論
09/06 16:52, 52F

09/07 21:23, , 53F
借問一下 VC 的 /Zi 是不是也有影響?
09/07 21:23, 53F

09/07 21:26, , 54F
應該不會吧.../Zi 不是只牽涉 *.pdb 嗎?純猜測
09/07 21:26, 54F

09/07 21:26, , 55F
為什麼你會覺得有關
09/07 21:26, 55F

09/08 00:05, , 56F
印象中會影響指令的順序 @@
09/08 00:05, 56F
文章代碼(AID): #1GHmP__m (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1GHmP__m (C_and_CPP)