ARM连接时重定位简介(中)

上篇介绍了一些基础知识,中篇详细讲一下其他的几个重定位项的格式。不全,但这些是我遇到的,对准确性负责。

一、前情提要

上篇讲了 printf 函数的重定位和 "HelloWorld" 的重定位,本篇详细讲一下遇到的情况。介绍一个背景,每个重定位项,都是由自身的属性 和对应的 symbol 项构成的,而symbol项又有自己的属性,所以需要多写一点脚本,将每个条目的详细信息都打一下。 用简单树状图表示一下它们之间的关系

1
2
3
4
5
6
7
relocation
|-> r_info_offset 表示从节开始起,偏移位置需要进行重定位
|-> r_info_type 表示重定位类型 (遇到三种 R_ARM_REL32 R_ARM_CALL R_ARM_GOT_PREL)
|-> r_info_sym 表示重定位的符号
\-> s_info.bind 表示该符号局部还是全局(遇到两种 STB_GLOBAL,STB_LOCAL)
\-> s_info.type 表示该符号本身类型(遇到三种 STT_OBJECT STT_NOTYPE STT_FUNC)
\-> s_info.st_value 表示该符号的值,当STT_NOTYPE时为0