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