作者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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1612618853.A.A61.html
1F:→ Lipraxde: 应该是他自己把 gcc 换成 ld,发现会找不到 _start 就 02/06 22:33
2F:→ Lipraxde: 用 -e 把 entry point 改了吧 02/06 22:33
3F:推 Schottky: 实用 (逃) 02/07 06:35
4F:推 gn00618777: "程式设计师的自我修养" 这本书 02/09 18:29
5F:推 gn00618777: 请问这个 retq 是对应 source code 的 return 0 吗 02/09 23:15
是的, 我没有把所有组合语言列出
6F:→ gn00618777: 看来我得学习一下gdb了,感觉以後debug很好用 02/09 23:15
7F:→ gn00618777: 我从上面的理解是 gcc compile时会加入一些 extern 02/09 23:17
8F:→ gn00618777: symble,这些simble是在 crt0.o内。这些会main之前执 02/09 23:18
9F:→ gn00618777: 行,也会在main结束後执行某些事情,但这些事情我的ld 02/09 23:18
10F:→ gn00618777: 又没 describe 这些 lib。 不知道我这样总结是对的吗? 02/09 23:19
11F:→ gn00618777: 还是这个 retq 是执行完 swap 後的 return? 02/09 23:21
12F:推 gn00618777: 好像又不太对><,如果我没describe这些lib,而又有 02/09 23:55
13F:→ gn00618777: extern symble,执行时应该会报 unreferenced defined 02/09 23:56
这只程式的问题不是你说的这些, 我第1眼看到这个程式时,
认为就算没有 c runtime 也应该可以正常执行,
但结果不是, 我才花时间找了一下问题, 是无法正常 exit
至於另外一个问题我没有细追, 不确定是哪边发生问题,
我遇到使用不同的编译参数,一个可以正常执行, 一个不能正常执行的结果时,
才发现有其他问题, 所以没有 c runtime 这个程式是会有问题的
程式的自我修养是本好书, 没有问题, 我记得有提到写一个 c++ runtime library
的部份, 可以看看那段
14F:→ Lipraxde: Compiler explorer 会用颜色把编译出来的结果和其对应 02/10 03:21
15F:→ Lipraxde: 的 source code 标示出来 02/10 03:21
※ 编辑: descent (1.200.93.82 台湾), 02/10/2021 23:13:19
16F:→ gn00618777: 我往後翻第四章,有些CRT观念带出来了 02/11 12:01
17F:推 gn00618777: 感谢Lipraxde大大分享好物 02/11 15:16