为什么在Ubuntu里,单独用cpp, cc1, as, ld产生的程序执行出错

尽头2nxszn98 2015-12-23 09:03:30
我是看到《深入理解计算机系统》这本书里第463页,作者分别用预处理器 cpp,编译器 cc1,汇编器 as 和链接器 ld 将源文件编译成可执行文件,可是我自己在ubuntu下试了一下,结果发生了段错误:


我的过程是这样的:
cpp main.c main.i
cc1 main.i main.c -o main.s
as main.s -o main.o
ld main.o -o main

其中在 ld 命令执行完后出现了如下警告:
ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0

求教这是为什么?
...全文
392 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2015-12-24
  • 打赏
  • 举报
回复
找不到入口点
liyuanbhu 2015-12-24
  • 打赏
  • 举报
回复
最后链接时需要加上 crt0.o,或者类似的文件。文件名有些记不清了。这个文件里包含了程序真正的入口。然后由它来调用main函数
尽头2nxszn98 2015-12-24
  • 打赏
  • 举报
回复
引用 5 楼 pcboyxhy 的回复:
 --dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o /usr/lib/x86_64-linux-gnu/crtn.o -lc
完整的需要很多工作的,你可以用
gcc --verbose main.c
看一下具体有多少内部流程
好的谢谢了,虽然没看懂哪些信息。
pcboyxhy 2015-12-24
  • 打赏
  • 举报
回复
 --dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o /usr/lib/x86_64-linux-gnu/crtn.o -lc
完整的需要很多工作的,你可以用
gcc --verbose main.c
看一下具体有多少内部流程
尽头2nxszn98 2015-12-24
  • 打赏
  • 举报
回复
引用 1 楼 pcboyxhy 的回复:
ld main.o -o main -lc --entry main

这样的话执行程序的时候又产生了这个错误:

pcboyxhy 2015-12-23
  • 打赏
  • 举报
回复
ld main.o -o main -lc --entry main

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧