【发布时间】:2020-03-03 08:27:55
【问题描述】:
我正在尝试理解 C 编译
鉴于 main.c 中的这个简单 C 代码:
int main() {
int a;
a = 42;
return 0;
}
我执行了以下操作:
cpp main.c main.i
/usr/lib/gcc/x86_64-linux-gnu/9/cc1 main.i -o main.s
as -o main.o main.s
ld -o main.exe main.o
执行 main.exe 时,出现分段错误。
如何在本例中获得良好的内存寻址?
【问题讨论】:
-
使用你的 olatrm gcc
-
如果将
main()函数重命名为start()会发生什么? -
@Jabberwocky 替换 C 启动代码并非易事。使用函数
_start(),链接器警告消失了,但程序从_start()返回后出现段错误。 -
@Bodo 我怀疑会发生什么
-
@johnnnn - 分段错误 在
main()返回时发生,因为堆栈上没有返回地址。通常,main()是从 C 运行时代码调用的。您可以了解gcc -v -o main.exe main.o在链接步骤中所做的工作。
标签: c linux compilation ld