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