[学习]链接
ELF可执行和可链接格式
强定义&弱定义带来的问题
静态库
- 可以将两个函数打包成静态库,然后调用的时候调用该库即可。
- 使用GCC编译器的时候需要将主程序与静态库连接。
- 相关的函数可以被编译为独立的目标模块,然后封装成一个单独的静态库文件,在链接时,链接器只拷贝程序引用的目标模块,这就减少了可执行文件,在磁盘和存储器中的大小。
- 在unix环境下使用AR工具可以将两个点o文件生成为静态库文件点a。
- 加载器将可执行目标文件中的代码和数据,从磁盘拷贝到存储器中,然后通过跳转到程序的第一条指令或入口点,来运行该程序,这个过程叫做加载。
共享库
- 共享库是一个目标模块,在运行时可以加载到任意的存储器地址,并和一个在存储器中的程序连接起来。这个过程叫做动态链接,是由一个叫做动态链接器的程序来执行的。
- 共享库也成为共享目标,在有unix系统中常用,点so后缀来表示,微软的操作系统大量的利用了共享库,他们称为dll,动态链接库。
- 可执行文件中,并没有拷贝共享库的代码和数据节,反之链接系准备了一些重定位和符号表现吸他们使得运行时可以解析对共享库中代码和数据的引用。