全域性變數什麼時候在記憶體中申請空間呢?

時間 2021-06-07 17:27:13

1樓:Chu

已初始化的全域性變數和區域性靜態變數儲存在 .data 段,在檔案中存在;未初始化的全域性變數和區域性靜態變數儲存在 .bss 段,因未初始化資料都是 \x00 ,儲存它們無意義,所以將其放於 .

bss,記錄大小,為變數預留位置,在檔案中不佔空間,引導程式時再分配。

> /tmp cat src.c

#include

int a = 233;

int b;

int mainb = 1024printf("%d\n", breturn 0;

}> /tmp gcc src.c

> /tmp objdump -s -j .data a.out

a.out: 檔案格式 elf64-x86-64

Contents of section .data:

201000 00000000 00000000 08102000 00000000201010 e9000000

> /tmp python -c 'print 0xe9'

233> /tmp objdump -x -j .bss a.out

...snip...

節:Idx NameSize VMALMAFile off Algn

23 .bss0000000c 0000000000201014 0000000000201014 00001014 2**2ALLOC

...snip...

> /tmp gdb ./a.out

Reading symbols from ./a.out...(no debugging symbols found)...done.

gdb-peda$ startregistersRAX: 0x5555555546a0 (: push rbp)

RBX: 0x0

RCX: 0x0

RDX: 0x7fffffffddc8 --> 0x7fffffffe130 ("CLUTTER_IM_MODULE=xim")

RSI: 0x7fffffffddb8 --> 0x7fffffffe125 ("/tmp/a.out")

RDI: 0x1

RBP: 0x7fffffffdcd0 --> 0x5555555546d0 (<__libc_csu_init>: push r15)

RSP: 0x7fffffffdcd0 --> 0x5555555546d0 (<__libc_csu_init>: push r15)

RIP: 0x5555555546a4 (: mov DWORD PTR [rip+0x20096a],0x4000x555555755018)

R8 : 0x555555554740 (<__libc_csu_fini>: repz ret)

R9 : 0x7ffff7de8bd0 (<_dl_fini>push rbp)

R10: 0x4

R11: 0x1

R12: 0x555555554570 (<_start>: xor ebp,ebp)

R13: 0x7fffffffddb0 --> 0x1

R14: 0x0

R15: 0x0

EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflowcode0x55555555469b : jmp 0x5555555545e0

0x5555555546a0 : push rbp

0x5555555546a1 : mov rbp,rsp

=> 0x5555555546a4 : mov DWORD PTR [rip+0x20096a],0x4000x5555557550180x5555555546ae : mov eax,DWORD PTR [rip+0x2009640x5555557550180x5555555546b4 :

mov esi,eax

0x5555555546b6 : lea rdi,[rip+0x970x555555554754

0x5555555546bd : mov eax,0x0stack0000| 0x7fffffffdcd0 --> 0x5555555546d0 (<__libc_csu_init>: push r15)

0008| 0x7fffffffdcd8 --> 0x7ffff7a313f1 (<__libc_start_main+241>: mov edi,eax)

0016| 0x7fffffffdce0 --> 0x40000

0024| 0x7fffffffdce8 --> 0x7fffffffddb8 --> 0x7fffffffe125 ("/tmp/a.out")

0032| 0x7fffffffdcf0 --> 0x1f7b9a888

0040| 0x7fffffffdcf8 --> 0x5555555546a0 (push rbp)

0048| 0x7fffffffdd00 --> 0x0

0056| 0x7fffffffdd08 --> 0x231dccb2ba367ddeLegend: code, data, rodata, value

Temporary breakpoint 1, 0x00005555555546a4 in main ()

gdb-peda$ p/d 0x400

$1 = 1024

gdb-peda$ xinfo 0x555555755018

0x555555755018 --> 0x0

Start : 0x0000555555755000

End : 0x0000555555756000

Offset: 0x18

Perm : rw-p

Name : /tmp/a.out

gdb-peda$ x/xw 0x555555755018

0x555555755018: 0x00000000

gdb-peda$ nregistersRAX: 0x5555555546a0 (: push rbp)

RBX: 0x0

RCX: 0x0

RDX: 0x7fffffffddc8 --> 0x7fffffffe130 ("CLUTTER_IM_MODULE=xim")

RSI: 0x7fffffffddb8 --> 0x7fffffffe125 ("/tmp/a.out")

RDI: 0x1

RBP: 0x7fffffffdcd0 --> 0x5555555546d0 (<__libc_csu_init>: push r15)

RSP: 0x7fffffffdcd0 --> 0x5555555546d0 (<__libc_csu_init>: push r15)

RIP: 0x5555555546ae (: mov eax,DWORD PTR [rip+0x2009640x555555755018)

R8 : 0x555555554740 (<__libc_csu_fini>: repz ret)

R9 : 0x7ffff7de8bd0 (<_dl_fini>push rbp)

R10: 0x4

R11: 0x1

R12: 0x555555554570 (<_start>: xor ebp,ebp)

R13: 0x7fffffffddb0 --> 0x1

R14: 0x0

R15: 0x0

EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflowcode0x5555555546a0 : push rbp

0x5555555546a1 : mov rbp,rsp

0x5555555546a4 : mov DWORD PTR [rip+0x20096a],0x4000x555555755018=> 0x5555555546ae : mov eax,DWORD PTR [rip+0x2009640x5555557550180x5555555546b4 :

mov esi,eax

0x5555555546b6 : lea rdi,[rip+0x970x555555554754

0x5555555546bd : mov eax,0x0

0x5555555546c2 : call 0x555555554560stack0000| 0x7fffffffdcd0 --> 0x5555555546d0 (<__libc_csu_init>: push r15)

0008| 0x7fffffffdcd8 --> 0x7ffff7a313f1 (<__libc_start_main+241>: mov edi,eax)

0016| 0x7fffffffdce0 --> 0x40000

0024| 0x7fffffffdce8 --> 0x7fffffffddb8 --> 0x7fffffffe125 ("/tmp/a.out")

0032| 0x7fffffffdcf0 --> 0x1f7b9a888

0040| 0x7fffffffdcf8 --> 0x5555555546a0 (push rbp)

0048| 0x7fffffffdd00 --> 0x0

0056| 0x7fffffffdd08 --> 0x231dccb2ba367ddeLegend: code, data, rodata, value

0x00005555555546ae in main ()

gdb-peda$ x/xw 0x555555755018

0x555555755018: 0x00000400

推薦閱讀:《程式設計師的自我修養》

全域性靜態變數,互斥訊號量等在記憶體中是怎麼處理?

L1和L2 Cache之間有Coherency protocol的。MESI裡面乙個Cache打算改乙個變數的時候會通知別的Cache,並令後者中的變數副本失效。這樣可以保證所有的Cache都能看到同樣的變數值。針對Mutex這種變數還有額外的硬體實現,來保證在任一時刻最多只有乙個CPU獨佔地對乙個...

python中使用全域性變數是否有什麼弊處?

冒泡 就py自己來說,主要還是太過靈活了,比如你可以不定義,直接global,或修改globals字典 a Traceback most recent call last File line 1,in NameError name a is not defined def fglobal a a 1...

英語中什麼時候用to,什麼時候不用to?

書徑海 1 to do 側重於具體的一次性的動作。2 doing 則側重於習慣性的動作。一 to do 讀音 英 tu du 美 tu du 釋義 要去做。語法 動詞不定式,為非謂語動詞。在英語語法中,動詞不定式是指動詞中的一種不帶詞形變化從而不指示人稱 數量 時態的一種形式。它之所以被稱做不定式,...