文章目录

    • 链接器的由来:
    • 链接过程的本质:
    • 目标文件的两种视图
    • 可重定位文件概述
    • ELF头和节头表
    • 可执行文件概述
    • 程序头表和存储器印象
    • 符号和符号表的基本概念
    • 全局符号的强弱特性
    • 多重符号定义举例
  • 精华PPT1
    • 静态共享库的创建
  • 精华PPT
    • 符号解析过程
  • 精华PPT
  • 精华PPT 2 链接器的顺序很重要
    • 链接顺序问题
    • 重定位的基本概念
    • PC相对地址重定位
    • 绝对地址重定位
    • 符合重定位举例
    • 可执行文件的加载
    • 共享库和动态链接库
    • 模块内引用和模块间数据引用
    • 模块间的调用或跳转

链接器的由来:

将跳转指令由符号表示,通过符号来确定程序执行代码的顺序这个就是链接的基础思想。

链接操作步骤:
符号解析 (确定符号代表着哪一段程序)+ 重定位 (把这些程序重新合成一个可执行文件,把片段放到可执行文件的里面的位置就是重定位,实际上是虚拟地址)

链接过程的本质:

将编译后的.o文件首先链接成在虚拟地址下的可执行文件,然后这个文件加载到虚拟内存中,由程序头表来记录程序在虚拟内存中的位置。




目标文件的两种视图

可重定位目标文件
可执行目标文件
共享的目标文件 就是dll

目标文件的格式


可重定位文件概述




小结:
bss节不占磁盘空间的原因是只需要在节头表说明在内存中需要给bss节留有一个内存空间大小就可以了

ELF头和节头表





小结:
e_type:小端 大端 的意思是在内存中存储数据从小地址到高地址存储的数据是从小到大,还是从大到小,这个在计算机网络中也很重要。

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

e_machine: 表示按照32位还是64位解释程序

读取ELF头 ,用readelf - h ,读取ELF节头表用readelf - s

节头表中 sh_addr 表示虚拟地址 ,若是可重定位目标文件则为0

可执行文件概述



程序头表和存储器印象





小结
BSS不占磁盘空间,但是占虚拟内存空间

符号和符号表的基本概念






小结
static定义的符号只能在本模块使用,是一个局部符号,函数内定义的变量不是一个符号。

全局符号的强弱特性




多重符号定义举例


精华PPT1



小结:
1、强弱定义符合的解析对于全局变量的赋值有着重要影响,考虑不周全的全局变量容易被意外赋值,考虑上面y z之的例子
2、多重符号定义,若强弱符号类型不一致,在编译时由于机器不知道类型不同,所以按照局部的自己的声明百编译,但是到了执行时,由于不同的数据类型占有的实际内存大小不一样,就会导致数据放入到错误的内存地址中,从而引发意外情况。

静态共享库的创建




精华PPT

gcc - c myproc1.c myproc2.c 将两个.c文件生成两个.o文件
ar rcs mylib.a myproc1.o  myproc2.o 将两个·.o文件合并到mylib.a的静态共享库文件中
gcc - c main.c
gcc -static -o myproc main.o ./mylib.c 将main.o 文件链接 mylib.c的库文件 生成可执行文件 myproc

符号解析过程

精华PPT


使用lib链接库不会链接没有使用的模块

精华PPT 2 链接器的顺序很重要

链接顺序问题



重定位的基本概念


PC相对地址重定位






init 为4的原因:call指令的位置与当前的位置相差4

绝对地址重定位



符合重定位举例



可执行文件的加载






共享库和动态链接库





模块内引用和模块间数据引用




模块间的调用或跳转


深入理解计算机操作系统:链接相关推荐

  1. 深入理解计算机操作系统:链接笔记

    链接的本质 简单版 实际版 可重定位目标文件 可执行目标文件 符号与符号表 静态库 动态库

  2. 深入理解计算机操作系统(一)

    目录 1.1 信息就是位加上下文 1.2 程序被其他程序翻译成不同的格式 1.3 了解编译系统如何工作是大有益处的 1.4 处理器读并解释储存在内存中的指令 1.4.1系统的硬件组成 1.4.2 运行 ...

  3. 【深入理解计算机操作系统】01_计算机系统漫游

    学习总路线 以hello程序的整个生命周期来开始对系统的学习 #include<stdio.h> int main() {printf("hello world!\n" ...

  4. 深入理解计算机操作系统(五)

    阅读经典--<深入理解计算机系统>04 函数调用时的栈结构变化是一个很有趣的话题,本文就来详细剖析这个过程. 栈帧结构 寄存器使用惯例 这段代码的含义? 栈帧结构 在计算机系统概述中我们介 ...

  5. 深入理解计算机操作系统:第2章 信息的表示和处理(学习笔记)

    现代计算机存储和处理的信息都是用二进制表示的,即0和1. 用多个二进制比特位的不同组合和不同解释能够表示数量有限的元素,比如用32位比特的组合则有2^32种可能,因此它能表示从0开始到42949672 ...

  6. 计算机操作系统第三章知识点,深入理解计算机操作系统第三章家庭作业

    3.58 y=y-z; x=x*y; return x ^ (y<<63>>63); 3.59 无符号64位,ux 和 uy 有符号64位,x 和 y 设 x 和 ux 具有相 ...

  7. 计算机操作系统与生态系统

    规律,世界的运转遵循着一定的规则.比如地球围绕着太阳转,月球围绕着地球转.我们无法理解月球为什么叫月球,因而CPU也是如此,他为什么用的是这个名词而不是别的,这些是一些约定俗成的东西.我们只需要理解他 ...

  8. 国防科大计算机考研大纲,2022年国防科技大学F1003计算机操作系统考研大纲及参考书目...

    2022年研究生入学考试自命题科目考试大纲 科目代码:F1003 科目名称:计算机操作系统 一.参考书目 1.<操作系统教程>(第5版),费祥林,高等教育出版社,2014年. 2.< ...

  9. 计算机操作系统还能这样玩?这一篇计算机操作系统的总结为你保驾护航(零风险、高质量、万字长文、建议收藏)

    操作系统目录 1.什么是操作系统 2.计算机操作系统的基本特征 2.1.并发 2.2.共享 2.3.虚拟 2.4.异步 3.操作系统的发展 4.OS的运行机制和体系结构 4.1.运行机制 4.1.1. ...

最新文章

  1. 我是如何根据豆瓣api来理解Restful API设计的
  2. 【JavaEE】WebService到底是什么?
  3. freeRtos学习笔(3)临界区管理
  4. 【控制】李亚普诺夫稳定性分析
  5. Web黑客工具箱之LiveHttpHeaders
  6. Python getattr() 函数
  7. DTrace Tools
  8. 二进制转8421bcd码_中山CVI转CVBS芯视音科技原装
  9. 昔年浅谈成都的百度推广公司靠谱吗这个问题?!
  10. contentType,charset和pageEncoding的区别
  11. ubuntu修改登陆用户名称_MySQL对于相同名称用户但host不同的登陆选择
  12. java jsonobject_Java调用groovy及如何使用springBean
  13. java 数据库连接 释放_JDBC连接数据库和释放连接
  14. DenseNet代码实现
  15. UDP socket编程: C++发送 | C#接收
  16. 乱码问题的原理及解决方法
  17. java日历数据_JAVA 常用数据类型 之日历类
  18. jQuery插件使用-瀑布流
  19. 关于Java使用POI对Excel2003和2007的导入和导出
  20. 爬取B站视频弹幕生成词云

热门文章

  1. android网络编程——HttpGet、HttpPost比较
  2. 无法解析类型 java.lang.Object。从必需的 .class 文件间接引用了它
  3. Vue项目中一些常见的文件名及作用
  4. 中的stop_谈谈stop容器
  5. python 异常处理 库_python异常处理详解
  6. 迭代器自定义遍历对象
  7. IE10,IE9透明元素无法点击
  8. 实例谈谈this在JavaScript中如何工作
  9. python之print实践
  10. 关于Eclipse安装Scala插件不显示