Linux进程下的编译
-
在Linux下面,二进制的程序要有严格的格式,这个格式称为ELF(Executeable and Linkable Format,可执行与可链接格式),这个格式可以根据编译的结果不同,分为不同的格式。
-
源文件.c和头文件.h最终编译成为的.o对象文件,是ELF的第一种类型,即可重定位文件(Relocatable File)。
-
局部变量放在栈里,程序运行过程中随时分配空间,随时释放,对于.o的二进制文件,程序还未启动,可重定位文件.o里没有局部变量。
-
对于编译好的代码和变量,将其加载到内存里时,要加载到一定位置,如函数所在的代码位置,全局变量所在的位置。但对于.o文件,不可以直接运行,这里面只是部分代码片段,.o里面的位置是不确定的,所以必须可重定位。
-
若函数作为库文件被重用,不能以.o的形式存在,而是要形成库文件,最简单的类型是静态链接库.a文件(Archives)。
-
在.o文件间的链接过程中,重定位起作用,链接结束后,形成的二进制文件叫可执行文件,是ELF的第二种格式。
-
静态链接库一旦链接进去,代码和变量的部分就进行合并,因而程序运行的时候,就不依赖于这个库是否存在。但对于相同的代码段,如果被多个程序使用的话,在内存里面就有多份,一旦静态链接库更新,如果二进制执行文件不重新编译,也不随着更新。
-
动态链接库(Shared Libraries),不仅仅是一组.o对象文件的简单归档,而是多个对象文件的重新组合,可被多个程序共享。当一个动态链接库被链接到一个程序文件中的时候,最后的程序文件并不包括动态链接库中的代码,而仅仅包括对动态链接库的引用,并且不保存动态链接库的全路径,仅仅保存动态链接库的名称。
-
动态链接库,是ELF的第三种类型,共享对象文件.so(Shared Object)。运行时的链接动作都由动态链接器完成。