Re: [問題] ld 連結 object file
看板C_and_CPP (C/C++)作者descent (「雄辯是銀,沉默是金」)時間4年前 (2021/02/06 21:40)推噓5(5推 0噓 12→)留言17則, 3人參與討論串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
02/06 22:33, 1F
→
02/06 22:33,
4年前
, 2F
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
02/09 23:15, 5F
是的, 我沒有把所有組合語言列出
→
02/09 23:15,
4年前
, 6F
02/09 23:15, 6F
→
02/09 23:17,
4年前
, 7F
02/09 23:17, 7F
→
02/09 23:18,
4年前
, 8F
02/09 23:18, 8F
→
02/09 23:18,
4年前
, 9F
02/09 23:18, 9F
→
02/09 23:19,
4年前
, 10F
02/09 23:19, 10F
→
02/09 23:21,
4年前
, 11F
02/09 23:21, 11F
推
02/09 23:55,
4年前
, 12F
02/09 23:55, 12F
→
02/09 23:56,
4年前
, 13F
02/09 23:56, 13F
這隻程式的問題不是你說的這些, 我第1眼看到這個程式時,
認為就算沒有 c runtime 也應該可以正常執行,
但結果不是, 我才花時間找了一下問題, 是無法正常 exit
至於另外一個問題我沒有細追, 不確定是哪邊發生問題,
我遇到使用不同的編譯參數,一個可以正常執行, 一個不能正常執行的結果時,
才發現有其他問題, 所以沒有 c runtime 這個程式是會有問題的
程式的自我修養是本好書, 沒有問題, 我記得有提到寫一個 c++ runtime library
的部份, 可以看看那段
→
02/10 03:21,
4年前
, 14F
02/10 03:21, 14F
→
02/10 03:21,
4年前
, 15F
02/10 03:21, 15F
※ 編輯: descent (1.200.93.82 臺灣), 02/10/2021 23:13:19
→
02/11 12:01,
4年前
, 16F
02/11 12:01, 16F
推
02/11 15:16,
4年前
, 17F
02/11 15:16, 17F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章