Re: [問題] ld 連結 object file

看板C_and_CPP (C/C++)作者 (「雄辯是銀,沉默是金」)時間4年前 (2021/02/06 21:40), 4年前編輯推噓5(5012)
留言17則, 3人參與, 4年前最新討論串2/2 (看更多)
│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

02/06 22:33, 4年前 , 1F
應該是他自己把 gcc 換成 ld,發現會找不到 _start 就
02/06 22:33, 1F

02/06 22:33, 4年前 , 2F
用 -e 把 entry point 改了吧
02/06 22:33, 2F

02/07 06:35, 4年前 , 3F
實用 (逃)
02/07 06:35, 3F

02/09 18:29, 4年前 , 4F
"程式設計師的自我修養" 這本書
02/09 18:29, 4F

02/09 23:15, 4年前 , 5F
請問這個 retq 是對應 source code 的 return 0 嗎
02/09 23:15, 5F
是的, 我沒有把所有組合語言列出

02/09 23:15, 4年前 , 6F
看來我得學習一下gdb了,感覺以後debug很好用
02/09 23:15, 6F

02/09 23:17, 4年前 , 7F
我從上面的理解是 gcc compile時會加入一些 extern
02/09 23:17, 7F

02/09 23:18, 4年前 , 8F
symble,這些simble是在 crt0.o內。這些會main之前執
02/09 23:18, 8F

02/09 23:18, 4年前 , 9F
行,也會在main結束後執行某些事情,但這些事情我的ld
02/09 23:18, 9F

02/09 23:19, 4年前 , 10F
又沒 describe 這些 lib。 不知道我這樣總結是對的嗎?
02/09 23:19, 10F

02/09 23:21, 4年前 , 11F
還是這個 retq 是執行完 swap 後的 return?
02/09 23:21, 11F

02/09 23:55, 4年前 , 12F
好像又不太對><,如果我沒describe這些lib,而又有
02/09 23:55, 12F

02/09 23:56, 4年前 , 13F
extern symble,執行時應該會報 unreferenced defined
02/09 23:56, 13F
這隻程式的問題不是你說的這些, 我第1眼看到這個程式時, 認為就算沒有 c runtime 也應該可以正常執行, 但結果不是, 我才花時間找了一下問題, 是無法正常 exit 至於另外一個問題我沒有細追, 不確定是哪邊發生問題, 我遇到使用不同的編譯參數,一個可以正常執行, 一個不能正常執行的結果時, 才發現有其他問題, 所以沒有 c runtime 這個程式是會有問題的 程式的自我修養是本好書, 沒有問題, 我記得有提到寫一個 c++ runtime library 的部份, 可以看看那段

02/10 03:21, 4年前 , 14F
Compiler explorer 會用顏色把編譯出來的結果和其對應
02/10 03:21, 14F

02/10 03:21, 4年前 , 15F
的 source code 標示出來
02/10 03:21, 15F
※ 編輯: descent (1.200.93.82 臺灣), 02/10/2021 23:13:19

02/11 12:01, 4年前 , 16F
我往後翻第四章,有些CRT觀念帶出來了
02/11 12:01, 16F

02/11 15:16, 4年前 , 17F
感謝Lipraxde大大分享好物
02/11 15:16, 17F
文章代碼(AID): #1W7fnbfX (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1W7fnbfX (C_and_CPP)