ELF中特殊部分的格式是什么

What is the format of special section in ELF

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

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

.text.data 没有特殊格式。

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

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

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

.text 段仅包含 routines/functions 的机器代码。

让我们以这个简单的 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

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

但是请注意其他段中的重定位和符号信息:

$ 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