elf .rel.text 部分中 R_386_32/R_386_PC32 的含义

2024-04-27

为了理解重定位的概念,我编写了一个简单的 chk.c 程序,如下所示:

  1 #include<stdio.h>
  2 main(){
  3         int x,y,sum;
  4         x = 3;
  5         y = 4;
  6         sum = x + y;
  7         printf("sum = %d\n",sum);
  8 }

使用“objdump -d chk.o”的等效汇编代码是:

00000000 <main>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 e4 f0                and    $0xfffffff0,%esp
   6:   83 ec 20                sub    $0x20,%esp
   9:   c7 44 24 1c 03 00 00    movl   $0x3,0x1c(%esp)
  10:   00 
  11:   c7 44 24 18 04 00 00    movl   $0x4,0x18(%esp)
  18:   00 
  19:   8b 44 24 18             mov    0x18(%esp),%eax
  1d:   8b 54 24 1c             mov    0x1c(%esp),%edx
  21:   8d 04 02                lea    (%edx,%eax,1),%eax
  24:   89 44 24 14             mov    %eax,0x14(%esp)
  28:   b8 00 00 00 00          mov    $0x0,%eax
  2d:   8b 54 24 14             mov    0x14(%esp),%edx
  31:   89 54 24 04             mov    %edx,0x4(%esp)
  35:   89 04 24                mov    %eax,(%esp)
  38:   e8 fc ff ff ff          call   39 <main+0x39>
  3d:   c9                      leave  
  3e:   c3                      ret    

使用 readelf 看到的 .rel.text 部分如下:

Relocation section '.rel.text' at offset 0x360 contains 2 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000029  00000501 R_386_32          00000000   .rodata
00000039  00000902 R_386_PC32        00000000   printf

据此我有以下问题:

1)从 .rel.text 部分中的第二个条目,我能够理解 .text 部分中偏移量 0x39 处的值(此处为 0xfcffffff)必须替换为与符号表索引 9 关联的符号的地址(&结果是 printf)。但我在这里无法清楚地理解 0x02 (ELF32_R_TYPE) 的含义。 R_386_PC32 在这里指定了什么?谁能清楚地解释一下它的含义。

2)我也无法理解第一个条目。 .text 部分中 0x29 偏移处需要替换什么以及为什么这里不清楚。我再次想知道这里 R_386_32 的含义。我找到了一份 pdf elf_format.pdf,但我无法从中清楚地理解 .rel.text 部分中“Type”的含义。

3)我还想知道汇编inst“lea(%edx,%eax,1),%eax”的含义。虽然我找到了一个非常好的链接(LEA 指令的目的是什么? https://stackoverflow.com/questions/1658294/whats-the-purpose-of-the-lea-instruction)描述了lea的含义,但是lea的格式(括号内的3个arg是什么)不清楚。

如果有人能清楚地解释上述问题的答案,将不胜感激。尽管我已经通过谷歌进行了很多尝试,但我仍然在努力寻找这些问题的答案。

还有一个问题。我在下面显示了偏移量 5 和 9 的符号表条目。

 Num: Value Size Type Bind Vis Ndx Name 
 5: 00000000 0 SECTION LOCAL DEFAULT 5 
 9: 00000000 0 NOTYPE GLOBAL DEFAULT UND printf' 

.rel.text 表中第一个条目的信息字段是 0x05,表示符号表的索引。我已经显示了上面索引 5 的符号表条目,但无法理解它如何告诉我们它是针对 .rodata 的。


1), 2): R_386_32是一次搬迁,将符号的绝对 32 位地址到指定的内存位置。R_386_PC32是一次搬迁,将符号的 PC 相对 32 位地址到指定的内存位置。R_386_32对于静态数据很有用,如此处所示,因为编译器只是将重定位的符号地址加载到某个寄存器中,然后将其视为指针。R_386_PC32对于函数引用很有用,因为它可以用作函数的直接参数call. See elf_machdep.c http://freebsd.active-venture.com/FreeBSD-srctree/newsrc/i386/i386/elf_machdep.c.html有关如何处理重定位的示例。

3) lea (%edx,%eax,1),%eax简单的意思就是%eax = %edx + 1*%eax如果用 C 语法表示。在这里,它基本上被用作add opcode.

编辑:这是一个例子。

假设您的代码从 0x401000 开始加载到内存中,该字符串"sum = %d\n"结束于 0x401800(在.rodata部分),并且printf位于 libc 中的 0x1400ab80。

然后,R_386_32重定位在 0x29 将放置字节00 18 40 00在 0x401029 处(简单地复制符号的绝对地址),使指令位于 0x401028 处

  401028:   b8 00 18 40 00          mov    $0x401800,%eax

The R_386_PC32重定位在 0x39 处放置字节43 9b c0 13在 0x401039(十六进制值 0x1400ab80 - 0x40103d = 0x13c09b43)处,执行该指令

  401038:   e8 43 9b c0 13          call   $0x1400ab80 <printf>

我们减去 0x40103d 来计算 %pc 的值(这是后面指令的地址)call).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

elf .rel.text 部分中 R_386_32/R_386_PC32 的含义 的相关文章

  • 更改 WinForms 按钮突出显示颜色

    I found 这一页 https stackoverflow com questions 9260303 how to change menu hover color winforms 其中概述了如何更改 MenuStrip 及其项目的呈
  • 在键盘热插拔上加载模块

    我正在尝试学习如何为 Linux 系统编写模块和驱动程序 类似于this https unix stackexchange com questions 120839 usb kernel module does not load on de
  • 验证码怎么写?

    我正在开发一个注册表 我想放置验证码 我生成一个随机字符串 但如何将其转换为图像 否则我如何开发验证码或任何参考 谢谢 Try out 验证码 http recaptcha net plugins aspnet 或查看博客文章 使用 Asp
  • 如何在 ASP.NET 5/vNext/Core 中使用 Elmah?

    我对如何在 ASP NET 5 MVC 6 项目中使用 Elmah 有点困惑 我从 nuget 得到了包 它添加了 Elmah Mvc 2 1 2 到project json 中的依赖项 我不知道从这里到哪里去 以前 nuget 会向 we
  • DPI 图形屏幕分辨率像素 WinForm PrintPageEventArgs

    对于运行我的应用程序的任何显示器 Dpi 点与像素有何关系 int points Screen primary public Form1 InitializeComponent points 1 primary null void OnPa
  • 如何将文本框中删除的字符替换为0

    在winforms中 如何用零替换删除的字符 例如 文本框中为 12 45 如果我们删除小数点后 它应该变成12 00 同样的方法删除前面的000 45 默认值应为 000 00 Use a 蒙版文本框 http msdn microsof
  • 字符串中unicode字符的正则表达式

    我正在使用 C 进行一些 OCR 工作 并提取了我需要使用的文本 现在我需要使用正则表达式解析一行 string checkNum string routingNum string accountNum Regex regEx new Re
  • Collection.Contains() 使用什么来检查现有对象?

    我有一个强类型的自定义对象列表 MyObject 它有一个属性Id 以及一些其他属性 假设Id of a MyObject将其定义为唯一 我想检查我的收藏是否还没有MyObject对象有一个Id在我添加新的之前 共 1 个MyObject到
  • 无法运行bjam编译boost python教程

    我正在尝试跟随本教程 http www boost org doc libs 1 55 0 libs python doc tutorial doc html python hello html关于为 Windows 的 python 包装
  • 树结构的序列化/反序列化

    我试图找出保存 序列化 并稍后打开 反序列化 树结构的最佳方法 我的结构由具有不同属性的各种对象类型组成 但每个对象类型都继承自基本抽象 Node 类 每个节点都有唯一的 ID GUID 并且有一个 AddSuperNode Node nd
  • 如何从子窗口中加载的用户控件按钮关闭子窗口?

    这是我的 ChildWindow xaml 代码 1
  • 弹出窗口或弹出窗口显示附加信息

    我想在我的应用程序顶部显示带有附加信息的弹出窗口 我的信息是Listview大约 500 个项目我都尝试过 有问题flyout gt 它里面可能有scrollViewer 所以我的列表视图不能正确虚拟化 其他一切都可以 有我的代码 Flyo
  • 如何存储将被多个不同类访问的字符串常量? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 关于堆栈溢出有太多不同的答案 声明一个命名空间 并在 hpp 文件中将所有字符串标记为 extern const 并在 cpp 文件中放置它们的
  • STL(标准模板库)中使用的设计模式

    我正在学习STL和设计模式 我想知道是否有任何文档或链接可以解释如何在 STL 中实现设计模式 我做了谷歌但无法获得太多数据 我希望你的意思是 哪些设计模式可以在STL中识别 STL 堆栈是一个容器适配器 适配器是一种设计模式 迭代器也是一
  • 当数据源中只有 1 项时 FormView 不显示 PagerTemplate

    我有一个带有自定义 PagerTemplate 的 FormView 控件和我自己的分页 LinkBut ton 一切都很好 直到我加载的数据集仅包含一个记录 项目并完全隐藏 PagerTemplate 我在网上搜索了一下 找到了几个答案
  • 跟踪 pthread 调度

    我想做的是创建某种图表 详细说明 Linux 中 两个 线程的执行情况 我不需要查看线程的作用 只需查看它们何时被安排以及持续多长时间 基本上是一条时间线 在过去的几个小时里 我一直在互联网上搜索跟踪 pthread 调度的方法 不幸的是
  • 类型“MyApp”已包含“MystatusBar”的定义

    我的应用程序 XAML
  • 模板是如何实例化的?

    这是一个练习 来自C 入门第五版 练习 16 27 对于每个带标签的语句 解释什么 如果有 实例化发生 如果实例化了模板 请解释原因 如果 不 请解释为什么不 第677页 template
  • 在 asp.net MVC 控制器中调用异步外部 Web 服务

    在 Asp net MVC 控制器 GET 方法 中 我调用外部 Web 服务 用于 IP 地理定位 返回 IP 位置的 json 数据 如何使调用异步 以便堆栈可以在等待服务响应时继续 当 GEO IP 请求完成后 我希望能够更新数据库
  • 使用 JSON.NET 反序列化一些 JSON

    我对 JSON 非常陌生 我需要解析 API 提供的一些内容 谷歌快速搜索出现了JSON NET http james newtonking com pages json net aspx 所以我现在尝试使用它将此 JSON 解析为列表对象

随机推荐