作者descent (「雄辯是銀,沉默是金」)
看板C_and_CPP
標題Re: [問題] ld 連結 object file
時間Sat Feb 6 21:40:45 2021
│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