内存分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(高地址)

栈区

堆区

未初始化(或初始值为0)的全局变量和静态变量 (.bss)

初始化的全局变量和静态变量 (.data)

常量区 (.rodata)

代码区

(低地址)
  • bss: block started by symbol
  • rodata: read-only data

代码

sum.c

1
$ cat sum.c
1
2
3
4
5
6
7
8
9
10
int sum(int a, int b)
{
static int val_1;
static int val_2 = 0;
static int val_3 = 1;
static int val_4 = 0;
static int val_5 = 2;
const static int val_6 = 0;
return a + b;
}

生成可重定位目标文件 sum.o

1
$ g++ -c sum.cpp -o sum.o

查看 sum.o 的段头表

1
$ readelf -S sum.o
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
There are 13 section headers, starting at offset 0x2a0:

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
0000000000000018 0000000000000000 AX 0 0 1
[ 2] .data PROGBITS 0000000000000000 00000058
0000000000000008 0000000000000000 WA 0 0 4
[ 3] .bss NOBITS 0000000000000000 00000060
000000000000000c 0000000000000000 WA 0 0 4
[ 4] .rodata PROGBITS 0000000000000000 00000060
0000000000000004 0000000000000000 A 0 0 4
[ 5] .comment PROGBITS 0000000000000000 00000064
000000000000002c 0000000000000001 MS 0 0 1
[ 6] .note.GNU-stack PROGBITS 0000000000000000 00000090
0000000000000000 0000000000000000 0 0 1
[ 7] .note.gnu.pr[...] NOTE 0000000000000000 00000090
0000000000000020 0000000000000000 A 0 0 8
[ 8] .eh_frame PROGBITS 0000000000000000 000000b0
0000000000000038 0000000000000000 A 0 0 8
[ 9] .rela.eh_frame RELA 0000000000000000 00000218
0000000000000018 0000000000000018 I 10 8 8
[10] .symtab SYMTAB 0000000000000000 000000e8
00000000000000f0 0000000000000018 11 9 8
[11] .strtab STRTAB 0000000000000000 000001d8
000000000000003b 0000000000000000 0 0 1
[12] .shstrtab STRTAB 0000000000000000 00000230
000000000000006f 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
D (mbind), l (large), p (processor specific)

.data

  • 大小为 8 字节
  • 在目标文件中占用 8 字节 (00000058 - 00000060)
  • val_3, val_5

.bss

  • 大小为 12 字节
  • 在目标文件中占用 0 字节 (00000060 - 00000060)
  • val_1, val_2, val_4

.rodata

  • 大小为 4 字节
  • 在目标文件中占用 4 字节 (00000060 - 00000064)
  • val_6