为了构 造可执 行文件 ,链接 器必须完成两个主要任务
符合解析
重定位
目标文件的三种形式
1.可重定位目标文件
包含二进制代码和数据 ,其形式可以在编译时与其他可重定位目标文件合并起来, 创建一 个可执行目标 文件。
2.可执行目标文件
包 含二进 制代码和数据 其形式可以被直接 复制到 内存并 执行
3.共享目标文件
一种特 殊类型 的可重定位目标文件 ,可 以在加载或者 运行时 被动态地 加载进 内存并 链接。
符号解析主要就是解析elf文件中存储符合的对应节点数据
重定位主要通过链接器确定运行时文件数据对应在内存中的位置,修改elf中可重定位节的全局和static变量或函数的位置,以方便其他调用者调用时知道去哪里找到对应的数据。
符合和符合表用来描述全局和static变量或函数的字符串信息。
重定位就是把符号表中的字符串与实际的代码进行对应,满足运行时调用需求。
重定位分2中方式:1.相对pc位置重定位 2.绝对位置重定位
相对pc位置重定位:当前程序执行的pc(程序计数器)地址的相对偏移量,cpu在使用时通过pc+偏移量获取实际地址
绝对位置重定位:程序中的绝对地址,CPU在使用时通过程序起始位置+程序中的地址获取实际地址
链接过程中与顺序有关,如果顺序不对可能导致对应的信息找不到。一般都是源文件在前,链接文件在后。如果连接文件中也有相互引用的关系也需要注意顺序,或者在写参数时在相应顺序下写多个,比如 a.c ->b.o ->d.o-> b.o,写2个b.o来保证对应的文件都能找到需要的信息。
把多个可重定向文件组合在一起方便连接的时候使用,在linux中形成静态连接库 。a文件
在生成静态库时并没有拷贝引用到的内,而是在链接时才回去做
静态链接库在链接时并不是把全部内容都赋值拷贝到目标可执行文件,只拷贝引用到的数据,没有引用的数据不进行拷贝。
静态连接库确定:如果库文件进行更新就需要每次都进行重新链接编译生成目标可执行文件。
为了解决静态库的缺点,发明了动态链接库。在linux中是。so文件
动态链接库在生成的时候就拷贝了引用的东西。
动态链接库在程序执行时动态链接编译,并且可以同时给多个目标可执行文件进行共享使用。
优点,方便库文件更新。多个共享一个库文件,节省磁盘空间。
动态链接库文件如果同时共享给多个执行文件使用,参照书中内容。
动态链接文件中地址为PIC(位置无关代码),这是能够动态链接的基础保障。
打桩机制个人理解就是代理,有编译打桩,链接打桩,运行时打桩。前两种类似静态代理,运行时打桩类似动态代理。通过一种机制能够在 运行时 打桩, 它只需 要能够访问可执行目标文件 。这个很厉 害的机 制基于 动态链 接器的 LD_PRELOAD 环境 变量