作者gn00618777 (非常念旧)
看板C_and_CPP
标题[问题] ld 连结 object file
时间Sat Feb 6 11:59:39 2021
我在阅读一本书,里面给一个静态连结的范例
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