就象上面 "sections" 中描述的那样,一个符号表部分的 sh_info 头中的成员
保留了第一个非局部符号的符号表索引。
符号的类型提供了一个为相关入口的普遍分类。
Figure 1-18: Symbol Types, ELF32_ST_TYPE
Name Value
==== =====
STT_NOTYPE 0
STT_OBJECT 1
STT_FUNC 2
STT_SECTION 3
STT_FILE 4
STT_LOPROC 13
STT_HIPROC 15
* STT_NOTYPE
该符号的类型没有指定。
* STT_OBJECT
该符号和一个数据对象相关,比如一个变量、一个数组等。
* STT_FUNC
该符号和一个函数或其他可执行代码相关。
* STT_SECTION
该符号和一个 section 相关。这种类型的符号表入口主要是为了重定位,一般的
具备 STB_LOCAL 约束。
* STT_FILE
按惯例而言,该符号给出了和目标文档相关的源文档名称。一个具备 STB_LOCAL
约束的文档符号,其 section 索引为 SHN_ABS ,并且他优先于当前对应该文档的
其他 STB_LOCAL 符号。
* STT_LOPROC through STT_HIPROC
该范围中的值是为处理器语义保留的。
共享文档中的函数符号(具备 STT_FUNC 类型)有特别的意义。当其他的目标文档
从一个共享文档中引用一个函数时,链接器自动的为引用符号创建一个链接表。除了
STT_FUNC 之外,共享的目标符号将不会自动的通过链接表引用。
假如一个符号涉及到一个 section 的特定定位,则其 section 索引成员 st_shndx
将保留一个到该 section 头的索引。当该 section 在重定位过程中不断
移动相同,符号的值也相应变化,而该符号的引用在程式中指向同样的定位。某些
特别的 section 索引有其他的语义。
* SHN_ABS
该符号有一个不会随重定位变化的绝对值。
* SHN_COMMON
该符号标识了一个没有被分配的普通块。该符号的值给出了相应的系统参数,就象
一个 section 的 sh_addralign 成员。也就是说,链接器将分配一个地址给
该符号,地址的值是 st_value 的倍数。该符号的大小指出了需要的字节数。
* SHN_UNDEF
该 section 表索引表明该符号是未定义的。当链接器将该目标文档和另一个定义
该符号的文档相装配的时候,该文档内对该符号的引用将链接到当前实际的定义。
如上所述,符号表的 0 索引(STN_UNDEF)是保留的,他包含了如下内容:
Figure 1-19: Symbol Table Entry: Index 0
Name Value Note
==== ===== ====
st_name 0 No name
st_value 0 Zero value
st_size 0 No size
st_info 0 No type, local binding
st_other 0
st_shndx SHN_UNDEF No section
Symbol Values(符号值)
符号表入口对于不同的目标文档而言对 st_value 成员有一些不同的解释。
* 在可重定位文档中, st_value 保存了 section 索引为 SHN_COMMON 符号
的强制对齐值。
* 在可重定位文档中, st_value 保存了一个符号的 section 偏移。也就是说,
st_value 是从 st_shndx 定义的 section 开头的偏移量。
* 在可执行的和可共享的目标文档中, st_value 保存了一个虚拟地址。为了使
这些文档符号对于动态链接器更为有效,文档层面上的 section 偏移让位于内存
层面上的虚拟地址( section 编号无关的)。
尽管符号表值对于不同的目标文档有相似的含义,相应的程式还是能够有效地访问数据。
====================== Relocation (重定位)==========================
重定位是连接符号引用和符号定义的过程。比如,当一个程式调用一个函数的时候,
相关的调用必须在执行时把控制传送到正确的目标地址。换句话说,重定位文档应当
包含有如何修改他们的 section 内容的信息,从而允许可执行文档或共享目标文档
为一个进程的程式映像保存正确的信息。重定位入口就是这样的数据。
Figure 1-20: Relocation Entries
typedef struct {
Elf32_Addr r_offset;
Elf32_Word r_info;
} Elf32_Rel;
typedef struct {
Elf32_Addr r_offset;
Elf32_Word r_info;
Elf32_Sword r_addend;
} Elf32_Rela;
* r_offset
该成员给出了应用重定位行为的地址。对于一个重定位文档而言,该值是从该
section 开始处到受到重定位影响的存储单位的字节偏移量。对一个可执行文档
或一个共享目标而言,该值是受到重定位影响的存储单位的虚拟地址。
* r_info
该成员给出了具备受重定位影响因素的符号表索引和重定位应用的类型。比如,
一个调用指令的重定位入口应当包含被调用函数的符号索引。假如该索引是
STN_UNDEF (未定义的符号索引),重定位将使用 0 作为该符号的值。重定位
类型是和处理器相关的。当正文(text)引用到一个重定位入口的重定位类型或符
号表索引,他表明相应的应用 ELF32_R_TYPE或 ELF32_R_SYM 于入口的 r_info
成员。
#define ELF32_R_SYM(i) ((i)>>8)
#define ELF32_R_TYPE(i) ((unsigned char)(i))
#define ELF32_R_INFO(s, t) ((s)<<8 (unsigned char)(t))
* r_addend
该成员指定一个常量加数(用于计算将要存储于重定位域中的值)。
如上所述,只有 Elf32_Rela 入口包含一个明确的加数。Elf32_Rel 类型
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




