<深入理解计算机系统>第七章读书笔记

链接

链接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程。(这个文件可被加载或拷贝到存储器并执行)

链接可以执行于编译,加载或运行时。

静态链接:

两个主要任务:

1 符号解析:将目标文件中的每个全局符号都绑定到一个唯一的定义

2 重定位:确定每个符号的最终存储器地址,并修改对那些目标的引用

符号表:

typedef struct{ int name; //字符串表中的字节偏移,指向符号的以NULL结尾的名字
int value; //符号的地址,对于可重定位的模块是距定义目标的节起始位置的偏移。
int size; //目标大小(单位:字节)
char type:4, //数据或函数
binding:4; //本地LOCAL/全局GLOBAL
char reserved;
char section; //到节头部表的索引
}Elf_Symbol;

每个符号都和目标的某个节相关联,由section字段表示。

section字段三个特殊的伪节

ABS:不该被重定位的符号。

UNDEF:未定义的符号,在本目标模块中引用,但在其他地方定义。

COMMON:未被分配位置的未初始化数据目标。

Ndx=1表示.test节,Ndx=3表示.data节。

目标文件三种形式:

1可重定位目标文件

2可执行目标文件

3共享目标文件

共享目标文件(共享库)是在运行时由动态链接器链接和加载,或者隐含地在调用程序被加载和开始执行时,或者根据需要在程序调用dlopen库的函数。

加载器将可执行文件的内容映射到存储器,然后调用动态链接器,通过加载共享库和重定位程序中的引用来完成链接任务。

Fpic

被编译为位置无关代码的共享库可以加载到任何地方,也可以在运行时被多个进程共享

编译库代码,使得不需要链接器修改库代码就可以在任何地址加载和执行这些代码。

用户对GCC使用-fPIC选项指示GNU生成PIC代码

处理目标文件的工具

AR:创建静态库,插入、删除、列出和提取成员。

STRINGS:列出一个目标文件中所有可打印的字符串。

STRIP:从目标文件中删除符号的信息。

NM:列出一个目标文件的符号表中定义的符号。

SIZE:目标文件中节的名字和大小。

READELF:显示一个目标文件的完整结构,包括ELF头中的编码的所有信息。包含SIZE和NM的功能。

OBJDUMP:所有二进制工具之母,能够显示一个目标文件中所有的信息。它最大的作用是反汇编.text节中的二进制指令。

LDD:列出一个可执行文件在运行时所需要的共享库。

<深入理解计算机系统>第七章读书笔记的更多相关文章

  1. linux内核设计与实现第七周读书笔记

    第七章 链接 链接(linking)是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储并执行.链接可以执行于编译时(compile time),也就是在源代 ...

  2. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  3. 《Linux内核设计与实现》Chapter 5 读书笔记

    <Linux内核设计与实现>Chapter 5 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已 ...

  4. 《Linux内核设计与实现》Chapter 18 读书笔记

    <Linux内核设计与实现>Chapter 18 读书笔记 一.准备开始 一个bug 一个藏匿bug的内核版本 知道这个bug最早出现在哪个内核版本中. 相关内核代码的知识和运气 想要成功 ...

  5. LINUX内核设计与实现第三周读书笔记

    LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...

  6. 《Linux内核设计与实现》Chapter 3 读书笔记

    <Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...

  7. 《Linux内核设计与实现》Chapter 1 读书笔记

    <Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...

  8. 《Linux内核设计与实现》Chapter 2 读书笔记

    <Linux内核设计与实现>Chapter 2 读书笔记 一.获取内核源码 1.使用Git 我们曾经在以前的学习中使用过Git方法 $ git clone git://git.kernel ...

  9. Linux内核设计与实现第十周读书笔记

    第十七章 设备与模块 关于设备驱动与设备管理,我们讨论四种内核成分. 设备类型 模块 内核对象 sysfs 17.1设备类型 在Linux以及所有Unix系统中,设备被分为以下三种类型: 块设备,块设 ...

  10. Linux内核设计与实现第八周读书笔记

    第四章 进程调度 进程在操作系统看来是程序的运行态表现形式. 4.1多任务 多任务操作系统就是能同时并发地交互执行多个进程的操作系统. 多任务操作系统会使多个进程处于堵塞或者睡眠状态.这些任务尽管位于 ...

随机推荐

  1. NLP的12条精髓

    NLP是神经语言程序学 (Neuro-Linguistic Programming) 的英文缩写.一.没有两个人是一样的 No two persons are the same. 1.没有两个人的人生 ...

  2. git remote add origin错误

    如果输入$ Git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git 提示出错信息:fatal: remote ...

  3. 使用Firebug或chrome-devToolBar深入学习javascript语言核心

    使用Firebug和chrome-devToolBar调试页面样式或脚本是前端开发每天必做之事.这个开发神器到底能给我们带来哪些更神奇的帮助呢?这几天看的一些资料中给了我启发,能不通过Firebug和 ...

  4. IT工具使用

    linux 其他知识目录 常用快捷键总结 博客view  code 删除,先删除,再清除格式

  5. java运行时内存分类

    主要有java栈(虚拟机栈), 堆 ,方法区. 线程私有: 栈: 每个方法执行的时候 都会同时创建一个栈桢 Stack Frame 用于存储  局部变量表, 操作数栈,动态链接, 方法出口等信息 线程 ...

  6. xpath获取同级元素

    XPath轴(XPath Axes)可定义某个相对于当前节点的节点集: 1.child 选取当前节点的所有子元素 2.parent 选取当前节点的父节点 3.descendant 选取当前节点的所有后 ...

  7. Linux java项目冲突不能正常运行

    部署项目,在windows环境部署到Tomcat能够正常运行,部署到Linux环境下只能访问一些html资源,不能正常运行. 解决步骤: 1.清除webapps目录下所有文件夹,将war包上传至web ...

  8. package分析

    由于大家对package的使用存在太多困惑,我在这里将自己对于package的使用的领悟进行一点总结: package中所存放的文件 所有文件,不过一般分一下就分这三种 1,java程序源文件,扩展名 ...

  9. 开发环境解决 kafka Failed to send messages after 3 tries

    新建了一个kafka集群,在window下写了一个简单的producer做测试,结果遇到了消息发送失败的问题,代码如下: Properties props = new Properties(); pr ...

  10. spring-test与junit

    1.添加依赖 spring-test junit spring-context(自动添加依赖其他所需的spring依赖包) 2.在class前添加以下注解,用于配置xml文件的位置 @RunWith( ...