C_and_CPP 板


LINE

我在阅读一本书,里面给一个静态连结的范例 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), 来自: 59.115.72.192 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1612583983.A.86F.html
1F:→ Lipraxde: 为什麽你要下 -e?环境比较特殊吗? 02/06 13:52
2F:→ Lipraxde: 你这样直接用 ld 编译出来的程式,会直接用 main 当 en 02/06 14:14
3F:→ Lipraxde: try point,不会经过 c runtime,所以stack 上的 retur 02/06 14:14
4F:→ Lipraxde: n address 是无效的,当执行到 return 0 的时候就会 se 02/06 14:14
5F:→ Lipraxde: gmentation fault 02/06 14:14
6F:推 Schottky: 所以正确的编译方法应该是这样: 02/06 14:52
7F:→ Schottky: gcc -c b.c -o b.o 02/06 14:52
8F:→ Schottky: gcc a.c b.o -o ab 02/06 14:52
9F:→ Schottky: gcc 才会正确把 C runtime 连结进来 02/06 14:53
10F:→ gn00618777: 请问经过 c runtime 是甚麽概念? 02/06 16:21
11F:→ gn00618777: 我在网路上看到和同事讨论知道要用gcc 连结,但我不解 02/06 16:22
12F:→ gn00618777: ld 为何就不行,书上这样写我照刻 02/06 16:22
13F:→ gn00618777: 下 -e 他entry point 就会是_start ,这是ld预设 02/06 16:23
14F:推 Schottky: C runtime 就是你还需要连结 crt0.o 的意思 02/06 16:46
15F:→ Schottky: 虽然你应该找不出这个 crt0.o 藏在哪个 library 里 02/06 16:46
16F:→ Schottky: C 语言写的程式,在呼叫 main 前还需要做一点事前准备 02/06 16:47
17F:→ Lipraxde: gcc ... -v 可以看到比较详细的编译过程,实际上会发现 02/06 16:56
18F:→ Lipraxde: link 阶段不是只把你自己写的那些程式 link 起来而已 02/06 16:56
19F:→ Lipraxde: ,还需要像是 c runtime、std lib 等东西 02/06 16:56
20F:推 LPH66: 你知道不设 -e 的预设进入点是 _start, 这个标签就是在 02/06 20:54
21F:→ LPH66: crt0.o 里面, 它包含一些在进你的 main 之前要执行的东西 02/06 20:55
22F:→ LPH66: 以及在你的 main 结束後帮你清理东西的程式也在里面 02/06 20:55
23F:→ LPH66: 这些东西就是上面推文提到的 C runtime 02/06 20:56
24F:→ descent: 是那一本书的内容呢? 02/06 21:22
25F:→ gn00618777: "程式设计师的自我修养" 这本书 02/09 18:29
26F:→ gn00618777: 原来有这麽多没提到的...,我再好好整理一下,谢谢 02/09 23:05
27F:→ gn00618777: 大家 02/09 23:05
28F:→ SonyF800: 那是因为你还在章节 4 ,章节 11 有大概讲一下 02/10 18:02
29F:→ SonyF800: 书上这边说的意思是,没给 -e main 的话预设会是 _start 02/10 18:03
30F:→ gn00618777: 我往後翻章节4有CRT概念带出了,不过要是我没发问 02/11 11:59
31F:→ gn00618777: 我肯定只是念过带过不会留意 02/11 12:00







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灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP