C_and_CPP 板


LINE

│0x4000f7 <main+15> lea -0x4(%rbp),%rax │ │0x4000fb <main+19> mov $0x6001b8,%esi │ │0x400100 <main+24> mov %rax,%rdi │ │0x400103 <main+27> callq 0x40010f <swap> │ │0x400108 <main+32> mov $0x0,%eax │ │0x40010d <main+37> leaveq │ >│0x40010e <main+38> retq 我使用 gdb 追蹤這個程式, 你的程式在 retq 這一行發生錯誤, 應該是因為 c runtime library 沒有被正確設定, 導致回不去上一層, 所以無法正確回到 shell。 int main() { int a = 100;^M swap(&a, &shared);^M asm ( "mov $1, %eax\n" "int $0x80\n" ); return 0; } 加入上述的 exit system call 就沒有問題了。 不過由於沒有使用 c runtime, 你得評估可能會發生什麼問題。 是哪本書告知你這個技巧呢? 感覺沒有補充說明該有的概念。 補充一下: 上述只是其中一種錯誤, 可能還會有另外的錯誤造成 Segmentation fault, 請不要以為這樣改就會是正確的程式碼。 ※ 引述《gn00618777 (非常念舊)》之銘言: : 我在閱讀一本書,裡面給一個靜態連結的範例 : a.c: : extern int shared; : int main() { : int a = 100; : swap(&a, &shared); : return 0; : } : b.c: : int shared = 1; : void swap(int *a, int *b){ : *a ^= *b ^= *a ^= *b; : } : 編譯指令: : gcc -c a.c -fno-stack-protector : gcc -c b.c -fno-stack-protector : 連結指令: : ld a.o b.o -e main -o ab : 執行時: : ./ab 出現 segmentation fault(core dump) : 請問有人知道這甚麼狀況嗎? 謝謝 : 我GCC 版本 gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 : ld 版本 GNU ld (GNU Binutils for Ubuntu) 2.34 -- 紙上得來終覺淺,絕知此事要躬行。 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.200.93.61 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1612618853.A.A61.html
1F:→ Lipraxde: 應該是他自己把 gcc 換成 ld,發現會找不到 _start 就 02/06 22:33
2F:→ Lipraxde: 用 -e 把 entry point 改了吧 02/06 22:33
3F:推 Schottky: 實用 (逃) 02/07 06:35
4F:推 gn00618777: "程式設計師的自我修養" 這本書 02/09 18:29
5F:推 gn00618777: 請問這個 retq 是對應 source code 的 return 0 嗎 02/09 23:15
是的, 我沒有把所有組合語言列出
6F:→ gn00618777: 看來我得學習一下gdb了,感覺以後debug很好用 02/09 23:15
7F:→ gn00618777: 我從上面的理解是 gcc compile時會加入一些 extern 02/09 23:17
8F:→ gn00618777: symble,這些simble是在 crt0.o內。這些會main之前執 02/09 23:18
9F:→ gn00618777: 行,也會在main結束後執行某些事情,但這些事情我的ld 02/09 23:18
10F:→ gn00618777: 又沒 describe 這些 lib。 不知道我這樣總結是對的嗎? 02/09 23:19
11F:→ gn00618777: 還是這個 retq 是執行完 swap 後的 return? 02/09 23:21
12F:推 gn00618777: 好像又不太對><,如果我沒describe這些lib,而又有 02/09 23:55
13F:→ gn00618777: extern symble,執行時應該會報 unreferenced defined 02/09 23:56
這隻程式的問題不是你說的這些, 我第1眼看到這個程式時, 認為就算沒有 c runtime 也應該可以正常執行, 但結果不是, 我才花時間找了一下問題, 是無法正常 exit 至於另外一個問題我沒有細追, 不確定是哪邊發生問題, 我遇到使用不同的編譯參數,一個可以正常執行, 一個不能正常執行的結果時, 才發現有其他問題, 所以沒有 c runtime 這個程式是會有問題的 程式的自我修養是本好書, 沒有問題, 我記得有提到寫一個 c++ runtime library 的部份, 可以看看那段
14F:→ Lipraxde: Compiler explorer 會用顏色把編譯出來的結果和其對應 02/10 03:21
15F:→ Lipraxde: 的 source code 標示出來 02/10 03:21
※ 編輯: descent (1.200.93.82 臺灣), 02/10/2021 23:13:19
16F:→ gn00618777: 我往後翻第四章,有些CRT觀念帶出來了 02/11 12:01
17F:推 gn00618777: 感謝Lipraxde大大分享好物 02/11 15:16







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP