目标文件
- 可重定位目标文件
- 可执行目标文件
- 共享目标文件
Windows NT -> PE(可移植可执行)
Unix -> ELF(可执行可链接)
静态链接
编译器生成可重定位目标文件 .o
链接器,将不同的可重定位文件,进行符号解析,重定位等操作。链接到一起。生成最终的可执行文件。
编译器生成的目标文件,从地址0开始。重定位操作,将不同的模块中的地址,与最终内存地址对应。
静态库 .a
将库文件拷贝,嵌入可执行文件中。链接发生在编译期间,程序运行之前。生成的最终程序中,包含所引用的静态库部分的一份拷贝。
缺点:
当静态库更新的时候,如果想使用新版本的库,必须重新链接。
共享库 .so .dll
动态连接器执行动态链接。
动态链接发生在执行期。编译生成的disk上的程序文件中并不含有共享库的代码。
程序执行时,共享库被加载到内存中的一个位置,所有使用共享库的程序都可以调用。
共享库生成的是位置无关代码PIC。