.bss:Uninitialized data(未初始化的数据)
.data:Initialized data(初始化数据)
.interp:Program interpreter path name(程序解释器路径名称)
.rodata:Read-only data (constants andliterals)(只读数据(常量和文字))
.text:Executable code(可执行代码)
.comment:Version control information(版本控制信息)
.dynamic:Dynamic linking tables(动态链接表)
.dynstr:String table for .dynamic section(.动态部分的字符串表)
.dynsym:Symbol table for dynamic linking(用于动态链接的符号表)
.got:Global offset table(全局偏移量表)
.plt:Procedure linkage table(程序链接表)
.rel‘name:Relocations for section name(分区名称的重新定位)
readelf -r hello.o显示可重定位段的信息
注释:
offset(偏移量):可在对应的目标section中的起始位置+偏移量,从而定位到需要修改的符号
Info:表示符号表索引和重定位类型(符号表索引占用高 32 位,重定位类型占用低 32 位)。符号表索引表示需要修改的符号引用在.symtabsection中的索引
Sym. Value和Sym. Name列:只是打印了所对应符号表条目中Value和Name列的值。
type:R_386_32表示绝对寻址, R_386_PC32表示相对寻址重定位
Addend是 Relocation Entry 结构体中的第 3 个字段,占用 8 字节,表示一个有符号常数,一些重定位类型要使用它对要修改符号做偏移调整。
重定位条目Rel和Rela之间的唯一区别:Rel中没有Addend字段。
作用:告诉链接器section中,需要进行修正的符号的地址。
每一个代码段或数据段,如果有需要都会产生对应的重定位表
.shstrtab:Section name string table
.symtab:Linker symbol table(链接器符号表)
readelf -s hello.o
Size: 长度;
Type=OBJECT:说明这是一个数据对象;
Bind=GLOBAL:说明这个符号是全局可见的,也就是在其他文件中可以使用;
Ndx=2:说明这个符号是属于第 2 个 段中,就是数据段(.data);