在第七章《链接》中的静态链接有对符号进行重定位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. ThreadLoacl,InheritableThreadLocal,原理,以及配合线程池使用的一些坑

    虽然使用AOP可以获取方法签名,但是如果要获取方法中计算得出的数据,那么就得使用ThreadLocal,如果还涉及父线程,那么可以选择InheritableThreadLocal. 注意:理解一些原理 ...

  2. 天猫精灵X1智能音箱使用感想

    11.22音箱到手,等了刚好一个月. 主要是测评语音交互功能. 测试条件:正宗普通话. 1)问天气.温度:表现良好.2)找手机功能:试了多次,每次都说手机号码格式不对3)小孩听故事:正常.但是开头会有 ...

  3. Phpstrom操作git

    1.PHPstrom操作git[上传] 2.提交代码到仓库 2. 3.使用git bash上传代码仓库的代码到远程服务器 代开git bash进入到项目所在的目录,输入命令$  git push .上 ...

  4. dd命令的巧妙使用

    dd是一个非常使用高效的命令,他的作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 一.备份 备份整个磁盘到磁盘 #将sdx整盘备份到sdy中去 dd if=/dev/sdx of=/ ...

  5. JAVA代码发送邮件示例和解释(二)

    之前有使用过一次在程序中发邮件的功能,也写了一篇相关的笔记,当时使用的是163邮箱,经过测试多个163账号都是可行的.但是最近把账号换成中国移动@chinamobilesz.com这种结尾的时候,却一 ...

  6. GitHub上最火的Android开源项目(一)

    GitHub在中国的火爆程度无需多言,越来越多的开源项目迁移到GitHub平台上.更何况,基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要.利用这些项目,有时能够让你 ...

  7. 【javascript】jQuery判断用户右击事件

    jquery 判断用户是鼠标是右击还是左击, // 1 = 鼠标左键 left; 2 = 鼠标中键; 3 = 鼠标右键 $(document).mousedown(function(e) { if(3 ...

  8. 【linux】安装mysql出现 no curses错误解决方法

    安装mysql,在./configure时出现错误:error: No curses/termcap library found的解决办法 mysql版本:5.1.30 已经不记得这次是第几次安装my ...

  9. CSS注释

    CSS注释 1./*注释内容*/ /*-moz-background-origin:border; -webkit-background-origin:border; -moz-background- ...

  10. Intel_CS_WebRTC 验证性测试

      机器: Centos 7.2 一.配置阿里云源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/Cen ...