LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3148|回复: 9

crt0.o是什么东西?

[复制链接]
发表于 2004-10-19 20:25:48 | 显示全部楼层 |阅读模式
今天看ld命令时,执行这样一句:
    ld -o hello  /lib/crt0.o hello.o -lc
提示我找不到crt0.o,为什么?
发表于 2004-10-20 08:25:44 | 显示全部楼层
/lib目录下有crt0.o吗?
发表于 2004-10-20 09:47:16 | 显示全部楼层
c run time
 楼主| 发表于 2004-10-20 15:17:21 | 显示全部楼层
我是在看ld的man手册页时看到这么一句的。
我的/lib下是没有crt0.o的,整个根目录搜索也搜索不到。那么要把hello.o链接成一个可执行文件,应该怎么做(用ld命令,而不是gcc)
发表于 2004-10-20 16:05:00 | 显示全部楼层
crt0.o应该是连接器在连接时自动加上去的。
要链接hello.o,可以这样:

  1. ld -o hello hello.o -lc -dynamic-linker /lib/ld-linux.so.2
复制代码
发表于 2004-10-21 01:06:08 | 显示全部楼层
这样才可以
ld -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o -lc hello.o /usr/lib/crtn.o

我的hello.c源码
int main()
{
printf("hello");
}

gcc -c hello.c
生成hello.o

然后用
ld -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o -lc hello.o /usr/lib/crtn.o

生成a.out

作实验才可以~~~~~谢谢
发表于 2004-10-21 11:46:15 | 显示全部楼层
多谢楼上的补充。
发表于 2004-10-22 11:17:53 | 显示全部楼层
  1. ld -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o -lc hello.o /usr/lib/crtn.o
复制代码

看来,没有连接这些模块,正是程序执行后出现段错误的原因。
发表于 2004-10-22 13:28:55 | 显示全部楼层
GCC是有很多组件组成的。crt0.o是GCC的一个安装部分。是这样介绍的:
     这个初始化和结束代码是为每个系统定制的,而且也被编译进该文件,该文件然后被联接到每个可执行文件中来执行必要的启动和终止程序。

上述我不太明白,出自《GCC技术参考大全》,希望有用!
 楼主| 发表于 2004-10-23 17:47:04 | 显示全部楼层
我找到了一个对crt0.o的解释:
crt0.o是应用程序编译链接时需要的起动文件,在程序链接阶段被链接。主要工作是初试化应用程序栈,初试化程序的运行环境和在程序退出时清除和释放资源。


但我不明白的是为什么Linux中没有crt0.o
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表