Linux内核之ELF格式解析(二)
编程过程中用到的变量和函数都可以称之为符号,一个ELF文件中并不只有一个符号节,通常是两个:
- 一个叫动态节,打印名称 为
.dynsym
,它的类型是SHT_DYNSYM
,所有引入的外部符号在这里有所体现. - 另一个类型值为
SHT_SYMTAB
,名字为.symtab
,它保存了所有有用的符号信息.
typedef struct elf32_sym{
Elf32_Word st_name;
Elf32_Addr st_value;
Elf32_Word st_size;
unsigned char st_info;
unsigned char st_other;
Elf32_Half st_shndx;
} Elf32_Sym;
st_name
: 符号的名字索引
这个成员是一个符号表对应的字符串表中的一个偏移,对应的字符串表可以通过该节link
成员获取得到.
st_value
: 符号地址
该成员给出了相应的符号值,根据符号类型和用途,它可能是个内存地址或者绝对值
st_size
: 符号的字节大小
如果是数据对象,可能给出该数据对象占用的大小,如果是函数,可能给出了函数指令占用的大小.
st_info
: 符号的信息
#define ELF_ST_BIND(x) ((x) >> 4)
#define ELF_ST_TYPE(x) (((unsigned int) x) & 0xf)
st_other
: 此字段恒为0
st_shndx
: 每个符号和某些节相关,这个字段给出了一个节头的索引.如果函数体所在的节不存于当前文件中,此字段为0.
typedef struct elf32_rel {
Elf32_Addr r_offset;
Elf32_Word r_info;
} Elf32_Rel;
typedef struct elf32_rela{
Elf32_Addr r_offset;
Elf32_Word r_info;
Elf32_Sword r_addend;
} Elf32_Rela;
r_offset
: 该成员给出了应用重定位行为的地址。对于一个重定位文件而言,该值是从该section
开始处到受到重定位影响的存储单位的字节偏移量。对一个可执行文件或一个共享目标而言,该值是受到重定位影响的存储单位的虚拟地址。
r_info
: 该成员给出了具有受重定位影响因素的符号表索引和重定位应用的类型。
/* The following are used with relocations */
#define ELF32_R_SYM(x) ((x) >> 8)
#define ELF32_R_TYPE(x) ((x) & 0xff)
r_addend
: 该成员指定一个常量加数(用于计算将要存储于重定位域中的值)。