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

https://blog.csdn.net/chengqiuming/article/details/90113855

一 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;
 
————————————————————————————————————————————————————————————————————————————————————————————————————————————————

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值