昨天晚上对.rodata和.data的概念比较模糊,今天特意做了实验具体分析一下,在此总结。
一、测试代码
const int g_test1 =0x123;
unsigned int g_test2 = 0xabc;
char g_test3[] = "asdfghjkl";
char g_test4[10];
char *g_test = "zzxcvcb";
static int g_test5 = 12;
static int g_teat6;
int main(void)
{
const char loc_test6 = 'a';
int loc_test1 = 0x89;
char loc_test2[] ="okminhbh";
char *loc_test3 = "1234545";
int loc_test4;
int loc_test5 = 0;
static int loc_test8 = 5;
static int loc_test7;
return 0;
}
二、反汇编代码
1
2 123.o: file format elf32-littlearm
3
4 Disassembly of section .text:
5
6 00000000 <main>:
7 0: e1a0c00d mov ip, sp
8 4: e92dd800 stmdb sp!, {fp, ip, lr, pc}
9 8: e24cb004 sub fp, ip, #4 ; 0x4
10 c: e24dd020 sub sp, sp, #32 ; 0x20
11 10: e3a03061 mov r3, #97 ; 0x61 ;loc_test6保存在stack
12 14: e54b300d strb r3, [fp, #-13]
13 18: e3a03089 mov r3, #137 ; 0x89 ;loc_test1保存在stack
14 1c: e50b3014 str r3, [fp, #-20]
15 20: e59f3034 ldr r3, [pc, #52] ; 5c <.text+0x5c>
16 24: e24bc020 sub ip, fp, #32 ; 0x20
17 28: e8930007 ldmia r3, {r0, r1, r2}
18 2c: e8ac0003 stmia ip!, {r0, r1}
19 30: e5cc2000 strb r2, [ip]
20 34: e59f3024 ldr r3, [pc, #36] ; 60 <.text+0x60>
21 38: e50b3024 str r3, [fp, #-36]
22 3c: e3a03000 mov r3, #0 ; 0x0
23 40: e50b302c str r3, [fp, #-44]
24 44: e59f0018 ldr r0, [pc, #24] ; 64 <.text+0x64>
25 48: ebfffffe bl 48 <main+0x48>
26 4c: e3a03000 mov r3, #0 ; 0x0
27 50: e1a00003 mov r0, r3
28 54: e24bd00c sub sp, fp, #12 ; 0xc
29 58: e89da800 ldmia sp, {fp, sp, pc}
30 5c: 0000000c andeq r0, r0, ip
31 60: 00000018 andeq r0, r0, r8, lsl r0
32 64: 00000020 andeq r0, r0, r0, lsr #32
33 Disassembly of section .data: ;g_test2 g_test3 g_test g_test5 loc_test8.0 保存在.data段
34
35 00000000 <g_test2>:
36 0: 00000abc streqh r0, [r0], -ip
37
38 00000004 <g_test3>:
39 4: 66647361 strvsbt r7, [r4], -r1, ror #6
40 8: 6b6a6867 blvs 1a9a1ac <.data+0x1a9a1ac>
41 c: 0000006c andeq r0, r0, ip, rrx
42
43 00000010 <g_test>:
44 10: 00000004 andeq r0, r0, r4
45
46 00000014 <g_test5>:
47 14: 0000000c andeq r0, r0, ip
48
49 00000018 <loc_test8.0>:
50 18: 00000005 andeq r0, r0, r5
51 Disassembly of section .bss: ;loc_test7.1 g_teat6 保存在.bss段
52
53 00000000 <loc_test7.1>:
54 0: 00000000 andeq r0, r0, r0
55
56 00000004 <g_teat6>:
57 4: 00000000 andeq r0, r0, r0
58 Disassembly of section .rodata: ; g_test1保存在.rodata段
59
60 00000000 <g_test1>:
61 0: 00000123 andeq r0, r0, r3, lsr #2
62 4: 63787a7a cmnvs r8, #499712 ; 0x7a000
63 8: 00626376 rsbeq r6, r2, r6, ror r3
64 c: 696d6b6f stmvsdb sp!, {r0, r1, r2, r3, r5, r6, r8, r9, fp, sp, lr}^
65 10: 6862686e stmvsda r2!, {r1, r2, r3, r5, r6, fp, sp, lr}^
66 14: 00000000 andeq r0, r0, r0
67 18: 34333231 ldrcct r3, [r3], #-561
68 1c: 00353435 eoreqs r3, r5, r5, lsr r4
69 20: 6c6c6568 cfstr64vs mvdx6, [ip], #-416
70 24: 6f77206f swivs 0x0077206f
71 28: 0d646c72 stceql 12, cr6, [r4, #-456]!
72 2c: 0000000a andeq r0, r0, sl
73 Disassembly of section .comment:
74
75 00000000 <.comment>:
76 0: 43434700 cmpmi r3, #0 ; 0x0
77 4: 4728203a undefined
78 8: 2029554e eorcs r5, r9, lr, asr #10
79 c: 2e342e33 mrccs 14, 1, r2, cr4, cr3, {1}
80 10: Address 0x10 is out of bounds.
81
三、各变量存储的段
const int g_test1 =0x123; //.rodata
unsigned int g_test2 = 0xabc; //.data
char g_test3[] = "asdfghjkl"; //.data
char g_test4[10];
char *g_test = "zzxcvcb"; //.data
static int g_test5 = 12; //.data
static int g_teat6; //.bss
int main(void)
{
const char loc_test6 = 'a'; //.stack
int loc_test1 = 0x89; //.stack
char loc_test2[] ="okminhbh";//.stack
char *loc_test3 = "1234545";//.stack
int loc_test4; //.stack
int loc_test5 = 0; //.stack
static int loc_test8 = 5; //.data
static int loc_test7; //.bss
return 0;
总结:
.text | 代码段 |
.data | 初始化的全局变量、初始化的静态变量 |
.rodata | const全局只读量 |
.bss | 未初始化的全局变量、初值为0的全局变量、未初始化的静态变量 |
.comment | 注释 |
stack | 函数内局部变量、const局部只读量 |
在实际应用中.bss段和.comment段并不保存在bin文件中,在代码重定位时将.bss段清零。const定义的局部常量与全局常量存储的位置不同,一个在data段一个在栈区。