C_and_CPP 板


LINE

│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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP