链接器作用:
将目标文件(.o .obj)和外部库 合并成Executable
1.解析符号,填写符号地址(比如函数,变量,自己的or外部的?)
2.重定位(在取得了每个符号的引用和定义的连接之后,要把符号的定义在存储器中绑定一个具体的地址)
常见链接器:
GNU链接器ld
llvm链接器lld
msvc链接器link
静态链接:
静态库:静态库由多个目标文件(.o .obj)打包而成,链接的时候只取需要的目标文件 windows:lib linux:a
动态链接:
动态库:windows:dll linux:so macos:dynlib
动态链接器本身不可以依赖于其他任何共享对象;动态链接器本身所需要的全局和静态变量和重定位工作由它本身完成
过程:
将动态链接信息写入可执行文件,新增GOT和dynamic 段
dynamic段中保存了可执行文件依赖哪些动态库,动态链接符号表的位置以及重定位表的位置等信息