在这篇blog里,你将了解到以下的内容:
1. 一个.c文件是怎么变成一个可执行文件,中间会产生那几种文件,在执行的时候又是怎么被加载进操作系统的?
2. 在形成这些不同文件的过程中,即链接的过程中,容易诱发那几种问题,诱发这些问题的原因是什么,如何避免这些问题?
3. 链接分成那几种形式?静态链接库与动态链接库是什么,如何构成静态链接库和动态链接库,静态链接库和动态链接库的利弊?
好的,接下来让我们一起开始一起解决这些问题:
问题1:
请大家先.c文件编译,链接,加载,运行的大概框图:
这幅图展示的是一个main2.c的.c文件和vector.h的头文件编译运行的过程,该图表示是动态链接库的链接过程。首先是,一个main2.c和vector.h一起通过编译得到可重定位目标文件main2.o。虽然这个编译和链接的过程只用了一条命令:
gcc main2.c vector.h -o main2.o
但是却包含着编译的三个阶段:
1.利用c语言预处理程序cpp将main2.c翻译成ASCII码文件main2.i。
2.利用cc1(c语言编译器)将main2,i编译成main2.s汇编程序。
3.运行assemble汇编器,将main2.s编译成main2.o可定位目标文件。
再通过动态链接器(这部分动态链接的内容将在后面说明),链接进libc.so,libvector.so文件(重定位和符号表),最后得到p2这个可执行文件,再通过
./p
这个命令进行执行,在执行的过程中动态链接库会把相关的代码和数据链接进去。
至于,很关键的一点程序是如何被加载进去的,这里先放出加载时候的linux存储器映像: