2012-11-18 3 views
1

readelf -l /bin/bash이 나에게주는 MemSiz FileSiz 대이 :ELF 프로그램 헤더 :

 
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 

이 왜 어떤 LOAD 세그먼트에 대한 FileSiz 동일하지 MemSiz입니까? MemSiz에 포함되어 있지만 FileSiz이 아닌 메모리 영역은 어떻게 처리해야합니까?

+0

세그먼트가 나타내는 내용에 따라 다릅니다. –

+0

다음 섹션이 포함되어 있습니다 : '.init_array .fini_array .jcr .dynamic .got .got.plt .data .bss' – gvl

+0

'.bss' 섹션은 항상 로더에 의해 제로 아웃됩니다. 따라서 파일에 0 톤을 가져 오는 데는 아무런 문제가 없습니다. –

답변

4

문제가되는로드 가능한 세그먼트가 프로그램의 데이터 세그먼트 인 것으로 보입니다.

프로그램의 데이터 세그먼트에는 초기화되지 않은 프로그램 변수와 초기화되지 않은 프로그램 변수에 대한 공간이 모두 포함됩니다. 초기화 된 변수 값은 프로그램의 실행 파일에 저장된 입니다. 초기화되지 않은 프로그램 변수는 에 저장하지 않아도됩니다. 대신 공백은 특수 0 크기 섹션 ".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; 

, 상기 데이터 세그먼트의 부분은 매핑 ".bss라고"섹션 프로그램로드시에, 제로 채워질 것이다.

+0

그건 의미가 있습니다. 감사! – gvl