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

时间:2020-10-14 03:10:08

标签: elf

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

我试图在.data节中放置一些初始化的全局变量。如果我有int a = 10;

这样的全局语句,应该在ELF(.data节)中写什么格式?

1 个答案:

答案 0 :(得分:2)

.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

让我们使用elfcat转储.data节:

$ 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