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 釋義 要去做。語法 動詞不定式,為非謂語動詞。在英語語法中,動詞不定式是指動詞中的一種不帶詞形變化從而不指示人稱 數量 時態的一種形式。它之所以被稱做不定式,...