在第七章《链接》中的静态链接有对符号进行重定位PC相对引用的处理,书上对应的还有公式,但不是很好理解。现做实验对公式进行理解(公式内容如有兴趣可以参考原文)

我们的目的是根据.text节起点和目标函数地址(如下面的0x8048420),重新计算引用偏移量

现创建2个文件

//main.c
void swap();
int buf[2]={1,2};
int main()
{
        swap();
        return 0;
}

//swap.c 
extern int buf[];
int *bufp0 = &buf[0];
int *bufp1;
void swap()
{
        int temp;
        bufp1 = &buf[1];
        temp = *bufp0;
        *bufp0 = *bufp1;
        *bufp1 = temp;
}

可以看到main.c引用了swap.c的函数,编译main.c为main.o,反汇编有如下结果

objdump -d main.o

main.o:     file format elf32-i386
Disassembly of section .text:

00000000 <main>:
   0:   8d 4c 24 04             lea    0x4(%esp),%ecx
   4:   83 e4 f0                  and    $0xfffffff0,%esp
   7:   ff 71 fc                   pushl  -0x4(%ecx)
   a:   55                          push   %ebp
   b:   89 e5                     mov    %esp,%ebp
   d:   51                          push   %ecx
   e:   83 ec 04                 sub    $0x4,%esp
  11:   e8 fc ff ff ff           call   12 <main+0x12>   --对swap引用的地址偏移量为12(call命令占一个字节)
  16:   b8 00 00 00 00      mov    $0x0,%eax
  1b:   83 c4 04                add    $0x4,%esp
  1e:   59                         pop    %ecx
  1f:   5d                         pop    %ebp
  20:   8d 61 fc                lea    -0x4(%ecx),%esp
  23:   c3                         ret

将swap.o和main.o编译为可执行文件p,查看p的.text节信息(截取部分如下)

[15] .text             PROGBITS        08048330 000330 0001bc 00  AX  0   0 16--节起始地址为红色部分

反汇编p,(截取部分如下)

080483f0 <main>:
 80483f0:       8d 4c 24 04             lea    0x4(%esp),%ecx
 80483f4:       83 e4 f0                  and    $0xfffffff0,%esp
 80483f7:       ff 71 fc                    pushl  -0x4(%ecx)
 80483fa:       55                           push   %ebp
 80483fb:       89 e5                       mov    %esp,%ebp
 80483fd:       51                            push   %ecx
 80483fe:       83 ec 04                   sub    $0x4,%esp
 8048401:       e8 1a 00 00 00         call   8048420 <swap>
 8048406:       83 c4 04                  add    $0x4,%esp
 8048409:       31 c0                       xor    %eax,%eax
 804840b:       59                           pop    %ecx
 804840c:       5d                           pop    %ebp
 804840d:       8d 61 fc                  lea    -0x4(%ecx),%esp

由于不知道swap相对与.text起始地址的偏移量,我们采用main函数的地址,它相对于main函数的偏移量为0x12。

那么新的引用量为0x8048420-(0x080483f0+0x12)-4 = 1A

实际上0x080483f0+0x12+4的地址就是PC的值,0x8048420-PC就是偏移值

可见公式害死人。。。

《深入理解计算机系统》第7章:重定位PC相对引用的理解的更多相关文章

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

    第七章读书笔记 链接 链接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程.(这个文件可被加载或拷贝到存储器并执行) 链接可以执行于编译,加载或运行时. 静态链接: 两个主要任务: 1 符号 ...

  2. 深入理解计算机系统 Start && 第一章要点

    对此书已经慕名已久了,抽空看了第1,2,3,5章,其他章节等有空闲继续看吧. 我的许多博客是给自己快速复习使用的,比如此读书后感,你可以根据我下面的建议读完原书几章再回来复习一下(或许那时候就没必要回 ...

  3. 2013337朱荟潼 Linux&深入理解计算机系统第七章读书笔记——链接

    第七章--链接 0.总结 链接编译时可以采用静态链接或动态链接. 连接器主要任务:符号解析和重定位. 多个目标文件可定义相同的符号,可以被连接到一个单独的静态库. 链接器可以生成部分链接的可执行文件 ...

  4. 深入理解计算机系统_3e 第九章家庭作业 CS:APP3e chapter 9 homework

    9.11 A. 00001001 111100 B. +----------------------------+ | Parameter Value | +--------------------- ...

  5. 深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍

    第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9943779.html 本章汇编代码中常出现的几个指令及其含义 1.push 操作数的个数:1 将操作数(一般 ...

  6. 深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍

    第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9905345.html 机器级代码 计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节. ...

  7. 深入理解计算机系统 第三章 程序的机器级表示 part1

    如题所示,这一章讲解了程序在机器中是怎样表示的,主要讲汇编语言与机器语言. 学习什么,为什么学,以及学了之后有什么用 我们不用学习如何创建机器级的代码,但是我们要能够阅读和理解机器级的代码. 虽然现代 ...

  8. 20135202闫佳歆--week 7 深入理解计算机系统第七章--读书笔记

    参见上学期的学习笔记: http://www.cnblogs.com/20135202yjx/p/4836058.html

  9. 深入理解计算机系统_3e 第二章家庭作业答案

    初始完成者:哈尔滨工业大学 李秋豪 许可:除2.55对应代码外(如需使用请联系randy.bryant@cs.cmu.edu),任何人可以自由的使用,修改,分发本文档的代码. 本机环境: (有一些需要 ...

随机推荐

  1. 使用flask_sqlalchemy

    首先引用一下廖雪峰Python教程里关于sqlalchemy的话, 这里我们要讲的是flask_sqlalchemy的用法. 1. 安装 用pip安装即可, 进入cmd控制台输入 pip instal ...

  2. 老机器安装Centos

    512M内存,80G硬盘 ubuntu-server没有压力,但是因为很多平台只支持centos服务器linux系统 内存要超过1G默认才能用图形界面安装.装好之后即使256M内存都可以跑起来.lin ...

  3. CDN网络架构

    CDN(content delivery network 内容分发网络) 本质上就是提供缓存,使得用户总是能访问离他最近的服务器,akamai是世界上的第一家做CDN的公司 实例:构建CDN分发网络架 ...

  4. 实战项目:EMOS集成邮件平台

    实战项目:EMOS集成邮件平台用户邮箱系统:http://mailAnonymous.cn/邮件服务器管理平台http://mailAnonymous.cn/extman 项目需求:随着公司规模不断扩 ...

  5. Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比

    比较的指标: 1.cpu 2.流量 3.电量 4.内存占用 5.联网时间 功能点: 1.重试机制 2.提供的扩展功能 3.易用性 4.是否https 5.是否支持reflect api,OkHttp有 ...

  6. dedecms 在php5.4以上环境下 无法保存中文

    dedecms gbk版本在php5.4以上环境下 无法保存中文 原因在于5.4.0对这个函数的变化:htmlspecialchars5.4.0   The default value for the ...

  7. Java Web项目(Extjs)报错八

    1.Java Web项目(Extjs)报错八 具体报错如下: org.springframework.dao.DataIntegrityViolationException: Could not ex ...

  8. MongoDB集群之分片

    原文:点击打开链接 MongoDB分片 分片(sharding)是将数据拆分,将其分散在不同的机器上的过程.MongoDB支持自动分片 片键(shard key)设置分片时,需要从集合里面选一个键,用 ...

  9. XmlDocument 转换为xml字符串

    static public string XMLDocumentToString(XmlDocument doc)     {         MemoryStream stream = new Me ...

  10. Flex和Java通信报错

    1.错误描述 11-30 18:15:52 ERROR [localhost-startStop-1] org.springframework.web.servlet.FrameworkServlet ...