gcc编译,ld连接

时间:2021-07-23 02:18:49

编写一个hello world的简单程序(hello.c):

1:  #include <stdio.h>
2:  
3:  int main(void)
4:  {
5:      printf("Hello world!/n");
6:  
7:      return 0;
8:  }

直接编译很简单:

gcc –o hello.o hello.c

但是如果使用gcc编译,然后使用ld连接,就会出错:

gcc –c –o hello.o hello.c
ld –o hello hello.o
连接时警告没有入口_start(程序原始的入口为_start,执行一些堆栈初始化工作,然后再跳入main函数),生成的hello文件无法执行。

说明分开连接的时候少做了一些事,使用gcc -v选项查看gcc编译时的信息:
gcc –o hello.o hello.c –v

最终的解决方案是:

gcc –c –o hello.o hello.c
ld –o hello –dynamic-linker /lib/ld-linker.so.2 /usr/lib/crt1.o /usr/lib/crti.o –l hello.o /usr/lib/ctrn.o

编译就可以了。