CSAPP课堂笔记4.1

缓冲区溢出

超越数组存储区范围

链接是什么

链接是将程序中的代码和数据部分收集起来并组合成一个可执行目标文件的过程。

  1. 静态连接:编译时链接
  2. 动态链接

加载时链接

运行时链接

链接器的由来

汇编语言出现后,用符号表示地址

链接器的主要任务

1、符号解析

​ 符号定义

​ 符号引用

2、重定位

需要将符号定义和引用建立关联

静态链接库以一组可重定位目标文件命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。

目标文件是字节块的集合。这些块中,有的包含程序代码,有的包含程序数据,而其他的包含指导链接器和加载器的数据结构。

编译器和汇编器生成可重定位目标文件,链接器生成可执行目标文件。

高级编程语言出现

子程序起始地址和静态变量起始地址是符号定义

调用子程序和试用静态变量是符号的引用

一个模块定义的符号可被另一个模块引用

.o相对地址

.p绝对地址

预处理

处理源文件中以#开头的预编译指令,包括

  1. #define
  2. #if,#ifdef
  3. #include
  4. 注释
  5. 添加行号和标识,以便编译时编译器产生调试用的行号信息
  6. 保留所有#pragma编译指令

预编译后,得到预处理文件(如hello.i),它是一个可读文本文件。

编译

将预处理文件进行词法分析,语法分析,语义分析并优化,生成汇编代码文件.s文件

.s文件还是可读的文本文件(mv,sub)

汇编

将汇编语言源程序转换为机器指令序列

汇编指令和机器指令一一对应,前者是后者的符号表示

它们都属于机器级指令,所构成的程序成为机器级代码。

链接

将多个重定位目标文佳合并得到可重定位目标文件

链接操作步骤

1)确定符号引用关系

2)合并.o文件

3)确定符号地址

4)在指令中填入新地址

好处

​ 1、模块化

一个程序可以分成很多源程序文件

可构建共享函数库,如数学,C标准库

​ 2、效率高

只需要重新编译被修改的源程序文件,然后重新链接

源文件中无需包含共享库函数的源码

链接的本质

合并相同的节(.text,.data,.bss)

Q:链接时,不知程序将装入内存何处执行,怎么办?

合并到虚拟地址空间中

三类目标文件

  1. 可重定位文件.o

    数据地址都从0开始

  2. 可执行目标文件.out

    多个.o文件合并

    代码和数据地址为虚拟地址空间中的地址

  3. 共享的目标文件

    被链接到某个可执行文件中

4.2 ELF文件格式

Executable and Linkable Format

链接视图(被链接)

由很多节组成,节是ELF文件中具有相同特征的最小可处理单位。

执行视图

由不同段组成,描述节如何映射到同一段

(如,合并.data和.bss,并映射到一个可读可写数据段中)

ELF头 52节,对文件类型等的说明(节头表)

.text 编译后的代码部分

.rodata 只读数据

.data 已初始化的静态变量

.bss 未初始化的静态变量(不占据实际硬盘空间)可以记成better save space

.symtab 存放函数和全局变量(符号表)信息,它不存放局部变量。

节头表

描述每个节的节命,在文件中的偏移,大小,访问属性,对齐方式。

可执行目标文件

为了能执行,将节合并成段,用程序头表(段头表)说明每个段的属性。

符号定义:符号所代表的地址值

定义的符号记录在符号表里

  1. 本模块全局变量
  2. 外部全局符号
  3. 本地符号

加了static变成局部变量,分配在.bss节

全局符号的强弱属性

函数名和已经初始化的全局变量名是强符号

未初始化的全局变量名是弱符号

Rule1:强符号不能多次定义

Rule2:若一个符号被定义为一次强符号和多次弱符号,按强为准

Rule3:多次弱符号,按前为准

符号解析时只能有一个确定的定义

链接顺序问题

重定位步骤

  1. 合并相同的节

  2. 对定义符号进行重定位

    确定新节中所有定义符号在虚拟地址空间中的地址

    每条指令和全局变量可确定地址

  3. 对引用符号进行重定位

    .rel.text(指令执行) .rel.data(定义)

    记录符号引用发生的位置,符号名

汇编器(.s->.o)遇到引用时,会生成一个重定位条目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值