有关章节索引字段(st_shndx)的信息,请参阅SHT_DYNSYM& SHT_SYMTAB

时间:2016-04-22 04:30:43

标签: arm elf dynamic-linking dynamic-loading

工具链: 产品:ARM编译器5.04 组件:ARM编译器5.04更新1(版本49)

来自ELF Portable Formats Specification,Version 1.1,

部分索引字段(st_shndx)包含: 每个符号表条目相对于某个部分是“已定义”的;该成员持有相关节头表索引。

我正在编译一个简单的对象(导出一个全局数据和例程)来理解ELF的各个字段

源代码(test.c):

__declspec(dllexport) int x21 = 0x100;
__declspec(dllexport) void bar21(void)
{
  x21++;
}

使用构建脚本(build.bat)

armcc -c test.c
armlink --bpabi --dll -o test.dll test.o
fromelf -cdrsy -o test.txt test.dll

我的查询是关于DYNSYM部分&的st_shndx字段的使用。 SYMTAB部分。

输出文件 (删除了几节以保持简短)

** Section #1 'ER_RO' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR]
    Size   : 24 bytes (alignment 4)
    Address: 0x00008000

    $a
    .text
    bar21
        0x00008000:    e59f000c    ....    LDR      r0,[pc,#12] ; [0x8014] = 0
        0x00008004:    e5901000    ....    LDR      r1,[r0,#0]
        0x00008008:    e2811001    ....    ADD      r1,r1,#1
        0x0000800c:    e5801000    ....    STR      r1,[r0,#0]
        0x00008010:    e12fff1e    ../.    BX       lr
    $d
        0x00008014:    00000000    ....    DCD    0

** Section #2 'ER_RW' (SHT_PROGBITS) [SHF_ALLOC + SHF_WRITE]
    Size   : 4 bytes (alignment 4)
    Address: 0x00000000

    0x000000:   00 01 00 00                                        ....


** Section #3 '.dynstr' (SHT_STRTAB)
    Size   : 32 bytes


** Section #4 '.dynsym' (SHT_DYNSYM)
    Size   : 80 bytes (alignment 4)
    String table #3 '.dynstr'
    Last local symbol no. 1

    Symbol table .dynsym (4 symbols, 1 local)

      #  Symbol Name                Value      Bind  Sec  Type  Vis  Size
    ========================================================================

      1  .data                      0x00000000   Lc    1  Sect  De   0x4
      2  shared_2.dll               0x00000000   Gb  Abs  Data  De 
      3  x21                        0x00000000   Gb    1  Data  Pr   0x4
      4  bar21                      0x00008000   Gb    2  Code  Pr   0x14


** Section #5 '.hash' (SHT_HASH)
    Size   : 40 bytes (alignment 4)
    Symbol table #4 '.dynsym'
<Section Truncated>


** Section #7 '.version' (SHT_GNU_versym)
    Size   : 10 bytes (alignment 4)
    Symbol table #4 '.dynsym'
<Section Truncated>    

** Section #8 '.version_d' (SHT_GNU_verdef)
    Size   : 56 bytes (alignment 4)
    String table #3 '.dynstr'
<Section Truncated>    

** Section #9 '.dynamic' (SHT_DYNAMIC)
    Size   : 120 bytes (alignment 4)
    String table #3 '.dynstr'
<Section Truncated>


** Section #10 '.debug_frame' (SHT_PROGBITS)
    Size   : 68 bytes


** Section #11 '.symtab' (SHT_SYMTAB)
    Size   : 176 bytes (alignment 4)
    String table #12 '.strtab'
    Last local symbol no. 6

    Symbol table .symtab (10 symbols, 6 local)

      #  Symbol Name                Value      Bind  Sec  Type  Vis  Size
    ========================================================================

      1  $a                         0x00008000   Lc    1   --   De 
      2  $d                         0x00008014   Lc    1   --   De 
      3  $d.realdata                0x00000000   Lc    2   --   De 
      4  shared_2.c                 0x00000000   Lc  Abs  File  De 
      5  .text                      0x00008000   Lc    1  Sect  De 
      6  .data                      0x00000000   Lc    2  Sect  De   0x4
      7  BuildAttributes$$ARM_ISAv4$S$PE$A:L22$X:L11$S22$IEEE1$~IW$USESV6$~STKCKD$USESV7$~SHL$OSPACE$EBA8$STANDARDLIB$REQ8$PRES8$EABIv2
                                    0x00000000   Gb  Abs   --   Hi 
      8  shared_2.dll               0x00000000   Gb  Abs  Data  De 
      9  x21                        0x00000000   Gb    2  Data  Pr   0x4
     10  bar21                      0x00008000   Gb    1  Code  Pr   0x14

第1节是代码区域(此处存在bar21例程)

第2节是RW区域(这里有x21变量)

现在,如果我们在DYNSYM部分&amp;中看到st_shndx(部分索引 - 在上面的输出中标记为“Sec”)字段。这两个变量的SYMTAB部分是不同的。

例如: DYNSYM中的x21指向第1部分(代码区域)&amp;在SYMTAB中,它指向第2部分(RW区域)

有人可以帮助我理解为什么吗?或者引导我到资源,在那里我可以获得更多相关信息。

此致 Raju Udava

0 个答案:

没有答案