Re: [問題] ld 連結 object file

作者: descent (「雄辯是銀,沉默是金」)   2021-02-06 21:40:45
│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
作者: Lipraxde (Lipraxde)   2021-02-06 22:33:00
應該是他自己把 gcc 換成 ld,發現會找不到 _start 就用 -e 把 entry point 改了吧
作者: Schottky (順風相送)   2021-02-07 06:35:00
實用 (逃)
作者: gn00618777 (非常念舊)   2021-02-09 18:29:00
"程式設計師的自我修養" 這本書請問這個 retq 是對應 source code 的 return 0 嗎看來我得學習一下gdb了,感覺以後debug很好用我從上面的理解是 gcc compile時會加入一些 externsymble,這些simble是在 crt0.o內。這些會main之前執行,也會在main結束後執行某些事情,但這些事情我的ld又沒 describe 這些 lib。 不知道我這樣總結是對的嗎?還是這個 retq 是執行完 swap 後的 return?好像又不太對><,如果我沒describe這些lib,而又有extern symble,執行時應該會報 unreferenced defined
作者: Lipraxde (Lipraxde)   2021-02-10 03:21:00
Compiler explorer 會用顏色把編譯出來的結果和其對應的 source code 標示出來
作者: gn00618777 (非常念舊)   2021-02-11 12:01:00
我往後翻第四章,有些CRT觀念帶出來了感謝Lipraxde大大分享好物

Links booklink

Contact Us: admin [ a t ] ucptt.com