当前位置:   article > 正文

可重定位文件.strtab section和.symtab section分析_symtab strtab

symtab strtab

一 ELF的.strtab section

1 readelf -x 10 add.o

  1. [root@localhost 0401]# readelf -x 10 add.o
  2. Hex dump of section '.strtab':
  3. 0x00000000 00616464 2e637070 00726573 756c7400 .add.cpp.result.
  4. 0x00000010 5f5a3361 64646969 00 _Z3addii.

上面是以16进制方式显示指定段内内容。0x00 0x61 0x64 0x64对应''、'a'、'd'、'd'

2 realelf -S add.o

  1. [root@localhost 0401]# readelf -S add.o
  2. There are 11 section headers, starting at offset 0x240:
  3. Section Headers:
  4. [Nr] Name Type Address Offset Size EntSize Flags Link Info Align
  5. [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0
  6. [ 1] .text PROGBITS 0000000000000000 00000040 0000000000000014 0000000000000000 AX 0 0 1
  7. [ 2] .data PROGBITS 0000000000000000 00000054 0000000000000004 0000000000000000 WA 0 0 4
  8. [ 3] .bss NOBITS 0000000000000000 00000058 0000000000000000 0000000000000000 WA 0 0 1
  9. [ 4] .comment PROGBITS 0000000000000000 00000058 000000000000002e 0000000000000001 MS 0 0 1
  10. [ 5] .note.GNU-stack PROGBITS 0000000000000000 00000086 0000000000000000 0000000000000000 0 0 1
  11. [ 6] .eh_frame PROGBITS 0000000000000000 00000088 0000000000000038 0000000000000000 A 0 0 8
  12. [ 7] .rela.eh_frame RELA 0000000000000000 00000228 0000000000000018 0000000000000018 I 9 6 8
  13. [ 8] .shstrtab STRTAB 0000000000000000 000000c0 0000000000000054 0000000000000000 0 0 1
  14. [ 9] .symtab SYMTAB 0000000000000000 00000118 00000000000000f0 0000000000000018 10 8 8
  15. [10] .strtab STRTAB 0000000000000000 00000208 0000000000000019 0000000000000000 0 0 1
  16. Key to Flags:
  17. W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
  18. I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  19. O (extra OS processing required) o (OS specific), p (processor specific)

3 hexdump -s 0x208 -n  25 -c add.o

  1. [root@localhost 0401]# hexdump -s 0x208 -n 25 -c add.o
  2. 0000208 \0 a d d . c p p \0 r e s u l t \0
  3. 0000218 _ Z 3 a d d i i \0

这些字符串所表示的内容,通常是程序中定义的函数名称,所定义过的变量等。

当对象文件中其他地方需要和一个这样的字符串关联的时候,往往会在对应的地方先存储.strtab section中的索引值。

4 .shstrtab section的查看方法

  1. [root@localhost 0401]# readelf -x 8 add.o
  2. Hex dump of section '.shstrtab':
  3. 0x00000000 002e7379 6d746162 002e7374 72746162 ..symtab..strtab
  4. 0x00000010 002e7368 73747274 6162002e 74657874 ..shstrtab..text
  5. 0x00000020 002e6461 7461002e 62737300 2e636f6d ..data..bss..com
  6. 0x00000030 6d656e74 002e6e6f 74652e47 4e552d73 ment..note.GNU-s
  7. 0x00000040 7461636b 002e7265 6c612e65 685f6672 tack..rela.eh_fr
  8. 0x00000050 616d6500 ame.

.shstrtab section也是字符串表,其中存储的是section的名字,而非函数或者变量的名称。

参考

https://www.jianshu.com/p/7a75324e98ab

二 ELF的.symtab section

1 点睛

符号表保存了程序实现或使用的所有全局变量和函数。

.symtab确定符号的名称与其值之间的关联,其中名称不是直接以字符串形式出现的,而是表示为某一字符串数组(.strtab)的索引。

.strtab保存了字符串数组(.shstrtab包含了节名称字符串表)。

2 查看方法

readelf -s file:显示符合表段中的项。

  1. [root@localhost 0401]# readelf -s add.o
  2. Symbol table '.symtab' contains 10 entries:
  3. Num: Value Size Type Bind Vis Ndx Name
  4. 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
  5. 1: 0000000000000000 0 FILE LOCAL DEFAULT ABS add.cpp
  6. 2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
  7. 3: 0000000000000000 0 SECTION LOCAL DEFAULT 2
  8. 4: 0000000000000000 0 SECTION LOCAL DEFAULT 3
  9. 5: 0000000000000000 0 SECTION LOCAL DEFAULT 5
  10. 6: 0000000000000000 0 SECTION LOCAL DEFAULT 6
  11. 7: 0000000000000000 0 SECTION LOCAL DEFAULT 4
  12. 8: 0000000000000000 4 OBJECT GLOBAL DEFAULT 2 result
  13. 9: 0000000000000000 20 FUNC GLOBAL DEFAULT 1 _Z3addii

3 符号表定义

  1. typedef struct elf64_sym {
  2. Elf64_Word st_name; // 符号名称,字符串表中的索引
  3. // STT_OBJECT表示符号关联到一个数据对象,如变量、数组或指针;
  4. // STT_FUNC表示符号关联到一个函数;
  5. // STT_NOTYPE表示符号类型未指定,用于未定义引用
  6. unsigned char st_info; // 类型和绑定属性:STB_LOCAL/STB_GLOBAL/STB_WEAK;
  7. unsigned char st_other; // 语义未定义,0
  8. Elf64_Half st_shndx; // 相关节的索引,符号将绑定到该节,此外SHN_ABS指定符号是绝对值,不因重定位而改变,SHN_UNDEF标识未定义符号。
  9. Elf64_Addr st_value; // 符号的值
  10. Elf64_Xword st_size; // 符号的长度,如一个指针的长度或struct对象中包含的字节数。
  11. }Elf64_Sym;

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/160481
推荐阅读
相关标签
  

闽ICP备14008679号