推 chuckAI:謝謝 killer大 雖然很多專業名詞看不懂 但文中的意思是原 06/18 09:25
→ chuckAI:宣告的參數a,b 位置會有offset的現象 但會隨著硬體有所不 06/18 09:27
→ chuckAI:同.. 我這樣的理解應該是對的吧.. 06/18 09:28
→ Killercat:簡單的說 a b都會跟__builtin_frame_address有一段固定 06/18 09:50
→ Killercat:的距離 你可以試試看用這段距離去取值 06/18 09:50
→ Killercat:但是我不知道他因為什麼而不同就是 06/18 09:50
推 Jockey66666:好文 06/18 11:21
推 AstralBrain:你的測試環境是linux x64吧, int應該會用register傳 06/18 13:48
→ AstralBrain:a本來放在rdi, b在rsi 06/18 13:50
推 AstralBrain:因為你要取址, compiler才在stack上隨便找個地方放a,b 06/18 13:53
→ AstralBrain:要放在哪裡已經不歸calling convention管了 06/18 13:54
→ Killercat:所以gcc會因為我執行__builtin_frame_address(0)所以隨 06/18 14:18
→ Killercat:便找一個地方先把arg stack dump出來嗎? 好詭異的行為 06/18 14:19
推 AstralBrain:因為你要&a, 所以把a從rdi搬到stack上 06/18 14:22
→ Killercat:我懂了 你是說他在compile time發現我要對a取址所以會多 06/18 14:27
→ Killercat:作一些額外的行為,把他從真正的frame stack搬出來對吧? 06/18 14:27
→ Killercat:因為就我理解用register傳應該只有fastcall會這樣玩... 06/18 14:28
→ Killercat:我回去試試看用別的型別 感謝 06/18 14:28
→ Killercat:欸 仔細看了一下 -S 你是對的 不過我這邊是放esi/edi 06/18 14:32
推 AstralBrain:x64因為多了一大堆register, 前幾個參數會跟fastcall 06/18 14:32
→ AstralBrain:一樣用register傳 06/18 14:32
→ Killercat:了解 看了一下.s的確也是如此.... 感謝! 06/18 14:33
推 AstralBrain:rsi/rdi是筆誤XD int是32bit所以會用e開頭的register 06/18 14:36
→ Killercat:不過這樣說的話 其實本來問題應該是無解了... 06/18 14:46
→ Killercat:因為型別不同他會用不同方法去傳 很傷腦筋 06/18 14:47
※ 編輯: Killercat (59.124.251.135), 06/18/2014 14:56:59
※ 編輯: Killercat (59.124.251.135), 06/18/2014 14:58:26
推 AstralBrain:所以交給gdb去撈debug symbol又快又方便 XD 06/18 14:58
→ Killercat:可是request是說要從callee... 所以才有這篇文章囧 06/18 15:08
→ azureblaze:我覺得他不見得只能改callee,可能只是想偏了... 06/18 15:15
→ azureblaze:如果型態不定數量不定那麻煩事還更多 06/18 15:16
→ azureblaze:沒reflection做這種事吃力不討好 06/18 15:17
→ Killercat:callee確定是不可行的了 這年頭連直接對frame stack hac 06/18 15:17
→ Killercat:k的最後希望都沒了 還能怎麼搞 :D 06/18 15:17
→ Killercat:大概就剩下Astral說的拿debug symbol拖出來鞭屍了 06/18 15:18