2012-11-18 35 views
1

readelf -l /bin/bash給了我這樣的:ELF程序頭:MemSiz與FileSiz

 
Program Headers: 
    Type   Offset    VirtAddr   PhysAddr 
       FileSiz   MemSiz    Flags Align 
    PHDR   0x0000000000000040 0x0000000000400040 0x0000000000400040 
       0x00000000000001f8 0x00000000000001f8 R E 8 
    INTERP   0x0000000000000238 0x0000000000400238 0x0000000000400238 
       0x000000000000001a 0x000000000000001a R  1 
     [Requesting program interpreter: /lib/ld-linux-x86-64.so.2] 
    LOAD   0x0000000000000000 0x0000000000400000 0x0000000000400000 
       0x00000000000aeef4 0x00000000000aeef4 R E 200000 
    LOAD   0x00000000000afde0 0x00000000006afde0 0x00000000006afde0 
       0x0000000000003cec 0x000000000000d3c8 RW  200000 
    DYNAMIC  0x00000000000afdf8 0x00000000006afdf8 0x00000000006afdf8 
       0x0000000000000200 0x0000000000000200 RW  8 
    NOTE   0x0000000000000254 0x0000000000400254 0x0000000000400254 
       0x0000000000000044 0x0000000000000044 R  4 
    GNU_EH_FRAME 0x000000000009dbc0 0x000000000049dbc0 0x000000000049dbc0 
       0x0000000000002bb4 0x0000000000002bb4 R  4 
    GNU_STACK  0x0000000000000000 0x0000000000000000 0x0000000000000000 
       0x0000000000000000 0x0000000000000000 RW  8 
    GNU_RELRO  0x00000000000afde0 0x00000000006afde0 0x00000000006afde0 
       0x0000000000000220 0x0000000000000220 R  1 

爲什麼MemSiz不等於FileSiz一些LOAD段? MemSiz包含的內存區域應該做些什麼,但不是FileSiz

+0

這取決於該細分代表什麼。 –

+0

它包含以下幾部分: '.init_array .fini_array .jcr .dynamic .got .got.plt .data .bss' – gvl

+0

那麼''.bss'節總是被加載器清零。所以在文件中引入大量的零是毫無意義的。 –

回答

4

有問題的可加載段似乎是程序的數據段。

程序中的數據段包含初始化程序變量和未初始化程序變量的空間。初始化變量的值是 存儲在程序的可執行文件中。未初始化的程序變量不需要 需要存儲在任何地方;相反,在 名爲「.bss」的特殊零大小段中爲它們保留空間。

可執行文件的數據段的文件大小因此可能小於內存大小的 。

爲了說明:

/* 
* Space for the intialized variable 'x' would be reserved the 
* executable's ".data" section, along with its initial value. 
*/ 
int x = 42; 

/* 
* Space for the uninitialized variable 'y' would be reserved in 
* the ".bss" section; no file space would be allocated in the 
* executable. 
*/ 
int y; 

在類Unix的系統中,數據段的部分映射到 「的.bss」部分將是零填充在程序加載時間。

+0

這很有道理。謝謝! – gvl