在第七章《链接》中的静态链接有对符号进行重定位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. ELF哈希技术

    ELFhash详情见点击打开链接 代码如下: unsigned int ELFhash(char *str) { unsigned int hash=0; unsigned int x=0; whil ...

  2. UVA - 247 Calling Circles Floyd判圈

    思路:利用的Floyd判圈,如果i能到j,j也能到i说明i和j在同一个圈里.每个人的名字可用map编号.最后DFS打印答案即可. AC代码 #include <cstdio> #inclu ...

  3. HDU - 1850 Nim博弈

    思路:可以对任意一堆牌进行操作,根据Nim博弈定理--所有堆的数量异或值为0就是P态,否则为N态,那么直接对某堆牌操作能让所有牌异或值为0即可,首先求得所有牌堆的异或值,然后枚举每一堆,用已经得到的异 ...

  4. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十)

    前言 朋友们, 大家好,我还是Rector,写ASP.NET MVC 5系列文章[一步一步创建ASP.NET MVC5程序Repository+Autofac+Automapper+SqlSugar] ...

  5. flask中jinjia2模板引擎详解3

    接上文 模板继承 Jinji2中的模板继承是jinjia2比较强大的功能之一. 模板继承可以定义一个父级公共的模板,把同一类的模板框架定义出来共享. 这样做一方面可以提取共享代码,减少代码冗余和重复的 ...

  6. 针对特定XML的解析器XMLParser

    一.建立网页库和偏移文件 为文本搜索引擎建立网页库,首先要把所有的网页(这里是文章)格式化,并保存到指定的格式中.如以下格式:   |                                  ...

  7. 一句Python,一句R︱numpy、array——高级matrix

    先学了R,最近刚刚上手python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句python,对应写一句R. python中的numpy模块相当于R中的matirx矩 ...

  8. Android WebView的缓存方式分析

    WebView的缓存可以分为(1)页面缓存和(2)数据缓存. 页面缓存是指当WebView加载一个网页时的html.JS.CSS等页面或者资源数据.这些缓存资源是由于浏览器的行为而产生,开发者只能通过 ...

  9. 查看dmp文件

    1.查看dmp文件,首先要通过以下的链接地址进行下载 http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.404.m ...

  10. VxWorks 引导程序

    前言:vxworks 的一些文件,如 usrconfig.c 在 config,comp目录中均有出现,因编译方式而选择某一个文件,命令行方式采用 config 目录文件,tornado 图形界面配置 ...