一 ELF的.strtab section
1 readelf -x 10 add.o
[root@localhost 0401]# readelf -x 10 add.o
Hex dump of section '.strtab':
0x00000000 00616464 2e637070 00726573 756c7400 .add.cpp.result.
0x00000010 5f5a3361 64646969 00 _Z3addii.
上面是以16进制方式显示指定段内内容。0x00 0x61 0x64 0x64对应''、'a'、'd'、'd'
2 realelf -S add.o
[root@localhost 0401]# readelf -S add.o
There are 11 section headers, starting at offset 0x240:
Section Headers:
[Nr] Name Type Address Offset Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0
[ 1] .text PROGBITS 0000000000000000 00000040 0000000000000014 0000000000000000 AX 0 0 1
[ 2] .data PROGBITS 0000000000000000 00000054 0000000000000004 0000000000000000 WA 0 0 4
[ 3] .bss NOBITS 0000000000000000 00000058 0000000000000000 0000000000000000 WA 0 0 1
[ 4] .comment PROGBITS 0000000000000000 00000058 000000000000002e 0000000000000001 MS 0 0 1
[ 5] .note.GNU-stack PROGBITS 0000000000000000 00000086 0000000000000000 0000000000000000 0 0 1
[ 6] .eh_frame PROGBITS 0000000000000000 00000088 0000000000000038 0000000000000000 A 0 0 8
[ 7] .rela.eh_frame RELA 0000000000000000 00000228 0000000000000018 0000000000000018 I 9 6 8
[ 8] .shstrtab STRTAB 0000000000000000 000000c0 0000000000000054 0000000000000000 0 0 1
[ 9] .symtab SYMTAB 0000000000000000 00000118 00000000000000f0 0000000000000018 10 8 8
[10] .strtab STRTAB 0000000000000000 00000208 0000000000000019 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
3 hexdump -s 0x208 -n 25 -c add.o
[root@localhost 0401]# hexdump -s 0x208 -n 25 -c add.o
0000208 \0 a d d . c p p \0 r e s u l t \0
0000218 _ Z 3 a d d i i \0
这些字符串所表示的内容,通常是程序中定义的函数名称,所定义过的变量等。
当对象文件中其他地方需要和一个这样的字符串关联的时候,往往会在对应的地方先存储.strtab section中的索引值。
4 .shstrtab section的查看方法
[root@localhost 0401]# readelf -x 8 add.o
Hex dump of section '.shstrtab':
0x00000000 002e7379 6d746162 002e7374 72746162 ..symtab..strtab
0x00000010 002e7368 73747274 6162002e 74657874 ..shstrtab..text
0x00000020 002e6461 7461002e 62737300 2e636f6d ..data..bss..com
0x00000030 6d656e74 002e6e6f 74652e47 4e552d73 ment..note.GNU-s
0x00000040 7461636b 002e7265 6c612e65 685f6672 tack..rela.eh_fr
0x00000050 616d6500 ame.
.shstrtab section也是字符串表,其中存储的是section的名字,而非函数或者变量的名称。
参考
https://www.jianshu.com/p/7a75324e98ab
二 ELF的.symtab section
1 点睛
符号表保存了程序实现或使用的所有全局变量和函数。
.symtab确定符号的名称与其值之间的关联,其中名称不是直接以字符串形式出现的,而是表示为某一字符串数组(.strtab)的索引。
.strtab保存了字符串数组(.shstrtab包含了节名称字符串表)。
2 查看方法
readelf -s file:显示符合表段中的项。
[root@localhost 0401]# readelf -s add.o
Symbol table '.symtab' contains 10 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS add.cpp
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 2
4: 0000000000000000 0 SECTION LOCAL DEFAULT 3
5: 0000000000000000 0 SECTION LOCAL DEFAULT 5
6: 0000000000000000 0 SECTION LOCAL DEFAULT 6
7: 0000000000000000 0 SECTION LOCAL DEFAULT 4
8: 0000000000000000 4 OBJECT GLOBAL DEFAULT 2 result
9: 0000000000000000 20 FUNC GLOBAL DEFAULT 1 _Z3addii
3 符号表定义
typedef struct elf64_sym {
Elf64_Word st_name; // 符号名称,字符串表中的索引
// STT_OBJECT表示符号关联到一个数据对象,如变量、数组或指针;
// STT_FUNC表示符号关联到一个函数;
// STT_NOTYPE表示符号类型未指定,用于未定义引用
unsigned char st_info; // 类型和绑定属性:STB_LOCAL/STB_GLOBAL/STB_WEAK;
unsigned char st_other; // 语义未定义,0
Elf64_Half st_shndx; // 相关节的索引,符号将绑定到该节,此外SHN_ABS指定符号是绝对值,不因重定位而改变,SHN_UNDEF标识未定义符号。
Elf64_Addr st_value; // 符号的值
Elf64_Xword st_size; // 符号的长度,如一个指针的长度或struct对象中包含的字节数。
}Elf64_Sym;