【问题标题】:What is the format of special section in ELFELF中特殊部分的格式是什么
【发布时间】:2020-11-21 07:51:11
【问题描述】:

我尝试编写一个程序来生成ELF(基于Arm并通过qemu-arm执行)。 ELF 中的大多数格式都得到了很好的说明 在wiki。但是我找不到任何描述特殊部分格式的规范(例如.text.data(尤其是我想知道的))。

我试图将一些初始化的全局变量放在 .data 部分。如果我有如下全局语句,我应该在 ELF(.data 部分) 中写什么格式:int a = 10;

【问题讨论】:

    标签: elf


    【解决方案1】:

    .text.data 没有特殊格式。

    当静态链接器链接多个.o文件时,

    1. 它只是连接 .text.data 段(同时解析重定位)
    2. 并根据链接描述文件将它们放入最终的.so 或可执行文件中(参见gcc -Wl,-verbose /dev/null)。

    .data 段仅包含实例化全局变量的初始值。

    .text 段仅包含例程/函数的机器代码。

    让我们来看看这个简单的 C 文件:

    char x[5] = {0xba, 0xbb, 0xbc, 0xbd, 0xbe};
    
    char f(int i) {
        return x[i];
    }
    

    让我们编译它:

    $ gcc -c -o test.o test.c
    

    让我们转储 .data 部分,使用 elfcat:

    $ elfcat test.o --section-name .data | xxd
    00000000: babb bcbd be                             .....
    

    我们可以清楚地解释.data部分的内容。

    让我们转储 .text 部分:

    $ elfcat test.o --section-name .text | xxd
    00000000: 5548 89e5 897d fc8b 45fc 4898 488d 1500  UH...}..E.H.H...
    00000010: 0000 000f b604 105d c3
    

    让我们反编译一下:

    $ elfcat test.o --section-name .text > test.text
    $ r2 -a x86 -b 64 -qc pd test.text
                0x00000000      55             push rbp
                0x00000001      4889e5         mov rbp, rsp
                0x00000004      897dfc         mov dword [rbp - 4], edi
                0x00000007      8b45fc         mov eax, dword [rbp - 4]
                0x0000000a      4898           cdqe
                0x0000000c      488d15000000.  lea rdx, qword [0x00000013] ; 19
                0x00000013      0fb60410       movzx eax, byte [rax + rdx]
                0x00000017      5d             pop rbp
                0x00000018      c3             ret
    

    同样,文本段没有什么特别之处:它只包含我的程序的例程/函数的机器代码。

    注意其他段的重定位和符号信息:

    $ readelf -a test.o
    [ ... ]
    
    Relocation section '.rela.text' at offset 0x1b8 contains 1 entry:
      Offset          Info           Type           Sym. Value    Sym. Name + Addend
    00000000000f  000800000002 R_X86_64_PC32     0000000000000000 x - 4
    
    Relocation section '.rela.eh_frame' at offset 0x1d0 contains 1 entry:
      Offset          Info           Type           Sym. Value    Sym. Name + Addend
    000000000020  000200000002 R_X86_64_PC32     0000000000000000 .text + 0
    
    [...]
    
    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 test.c
         2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 
         3: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 
         4: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 
         5: 0000000000000000     0 SECTION LOCAL  DEFAULT    6 
         6: 0000000000000000     0 SECTION LOCAL  DEFAULT    7 
         7: 0000000000000000     0 SECTION LOCAL  DEFAULT    5 
         8: 0000000000000000     5 OBJECT  GLOBAL DEFAULT    3 x
         9: 0000000000000000    25 FUNC    GLOBAL DEFAULT    1 f
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-21
      • 2021-09-04
      • 2018-04-29
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      相关资源
      最近更新 更多