编译系统4:链接

hello.c程序当中调用了printf,它是标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的hello.o程序中,链接器ld就是负责处理这种合并,最终得到a.out这个可执行的目标文件,它可以被加载到内存当中,由系统来执行

不过链接过程通常让人很费解,为什么汇编器不直接输出可执行文件,而是输出了一个目标文件呢,还有这个链接过程到底包含了些什么内容,下面可以给出如何调用ld才能产生一个能够正常运行的Hello World程序

由于cygwin跟linux环境还是有一些差别的,直接登陆一台服务器执行调用信息:

[lihui@master ~]$ ld -static /usr/lib64/crt1.o /usr/lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.4.6/crtbeginT.o -L /usr/lib/gcc/x86_64-redhat-linux/4.4.6/ -L /usr/lib64 -L /lib64 hello.o –start-group -lgcc -lgcc_eh -lc –end-group /usr/lib/gcc/x86_64-redhat-linux/4.4.6/crtend.o /usr/lib64/crtn.o

如果把路径都省略掉,上面命令就是:

ld -static crt1.o crti.o crtbeginT.o hello.o –start-group -lgcc -lgcc_eh -lc –end-group crtend.o crtn.o

可见要将一大堆文件链接起来才能得到a.out

至于说这些.o文件都是什么,作用是什么,以及这一步更深层的含义,可以自行研究

发表回复