赞
踩
一 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;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。