본문 바로가기
Research/SystemProg

Glabl변수의 초기화 및 영역

by sunnyan 2003. 12. 1.
728x90
Glabl변수의 초기화 및 영역 - Welcome

출처:www.ezdoum.com

version1: 
int myarray[1000]={1,2,3,4}; 
void main(int argc,char *argv[]) 
{ 
  myarray[0]=3; 
} 
 
version2: 
int myarray[1000]; 
void main(int argc,char * argv[]) 
{ 
  myarray[0]=3; 
} 
 
 실행 화일의 크기 비교 
 version 1: 17657 byte 
 version 2: 13629 byte 
 
왜 이렇게 차이가 나는 걸까요? 
두 프로그램 다 integer형의 배열이 1000개 만큼 잡히는 데요. 
고수님들의 답변 기대합니다. 
 
좋은 호기심입니다... 
  
 우선.. 이 현상을 이해 할려면,, elf 바이너리의 특성을 알아야 합니다.  
 
 여기 가시면 elf 바이너리 스팩이 있습니다. 
 http://www.ezdoum.com/stories.php?story=02/04/08/1870532 
  
 간략히 말하면  
 int myarray[1000]={1,2,3,4}와 
 int myarray[1000] 는 바이너리에서 자리 잡는 곳이 틀립니다. 
  
 int myarray[1000]={1,2,3,4}는 
 14 .data         00000fc0  08049400  08049400  00000400  2**5 
                  CONTENTS, ALLOC, LOAD, DATA 
 란 섹션에 자리를 잡게 되지요.. 즉.. 실행파일안에.. 
 Contents of section .data: 
 8049400 00000000 d0a30408 00000000 00000000  ................ 
 8049410 00000000 00000000 00000000 00000000  ................ 
 8049420 01000000 02000000 03000000 04000000  ................ 
 8049430 00000000 00000000 00000000 00000000  ................ 
 8049440 00000000 00000000 00000000 00000000  ................ 
 8049450 00000000 00000000 00000000 00000000  ................ 
 8049460 00000000 00000000 00000000 00000000  ................ 
 8049470 00000000 00000000 00000000 00000000  ................ 
 8049480 00000000 00000000 00000000 00000000  ................ 
 8049490 00000000 00000000 00000000 00000000  ................ 
 이런식으로 초기화된 값들이 들어있습니다. 
  
 하지만  int myarray[1000] 이녀석 같은 경우엔 
 초기화 되지 않았기 때문에 bbs 영역에 들어가게 되지요 
 20 .bss          00000018  0804a490  0804a490  00001490  2**2 
                  ALLOC 
  
 bss 영역은 실행 파일에 포함되지 않고 단지 섹션헤더에 
 자신의 사이즈 정보를 가지고 있어서,,, 바이너리가 
 로딩될때 공간만 확보를 하게 되지요.. 
  
  
 이것은 test1의 영역정보 요약입니다.  
 (int myarray[1000]={1,2,3,4}) 
  
 13 .rodata       00000008  080483f8  080483f8  000003f8  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
 14 .data         00000fc0  08049400  08049400  00000400  2**5 
                  CONTENTS, ALLOC, LOAD, DATA 
 -> 보시면  data영역이  뒤에볼 test2보다 크게 잡혀있는게 보입니다. 
 15 .eh_frame     00000004  0804a3c0  0804a3c0  000013c0  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 
 19 .dynamic      000000a0  0804a3f0  0804a3f0  000013f0  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 20 .bss          00000018  0804a490  0804a490  00001490  2**2 
                  ALLOC 
 -> 00001490이게 파일에서 옵셋포인터 인데, 다음 섹션인 stab의 
 옵셋이 00001490 으로 같은것을 볼수 있습니다. 바이너리가 
 로딩되었을때 사이즈만 가지고 있고 실제 파일에서는 아무것도 
 없는거죠..  
 21 .stab         00000750  00000000  00000000  00001490  2**2 
                  CONTENTS, READONLY, DEBUGGING 
 
 
 13 .rodata       00000008  080483f8  080483f8  000003f8  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
 14 .data         0000000c  08049400  08049400  00000400  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 ->  test1과는 달리 초기화된 데이터가 아니라  
   int myarray[1000]; 선언을 했기 때문에 여기 사이즈가 작습니다. 
 15 .eh_frame     00000004  0804940c  0804940c  0000040c  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 
 19 .dynamic      000000a0  0804943c  0804943c  0000043c  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 20 .bss          00000fc0  080494e0  080494e0  000004e0  2**5 
                  ALLOC                   
 21 .stab         00000750  00000000  00000000  000004e0  2**2 
                  CONTENTS, READONLY, DEBUGGING 
 
 
 
                
test1:     file format elf32-i386 
 
Sections: 
Idx Name          Size      VMA       LMA       File off  Algn 
  0 .interp       00000013  080480f4  080480f4  000000f4  2**0 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  1 .note.ABI-tag 00000020  08048108  08048108  00000108  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  2 .hash         0000002c  08048128  08048128  00000128  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  3 .dynsym       00000060  08048154  08048154  00000154  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  4 .dynstr       00000073  080481b4  080481b4  000001b4  2**0 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  5 .gnu.version  0000000c  08048228  08048228  00000228  2**1 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  6 .gnu.version_r 00000020  08048234  08048234  00000234  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  7 .rel.got      00000008  08048254  08048254  00000254  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  8 .rel.plt      00000018  0804825c  0804825c  0000025c  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  9 .init         0000002f  08048274  08048274  00000274  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, CODE 
 10 .plt          00000040  080482a4  080482a4  000002a4  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, CODE 
 11 .text         000000ec  080482f0  080482f0  000002f0  2**4 
                  CONTENTS, ALLOC, LOAD, READONLY, CODE 
 12 .fini         0000001a  080483dc  080483dc  000003dc  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, CODE 
 13 .rodata       00000008  080483f8  080483f8  000003f8  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
 14 .data         00000fc0  08049400  08049400  00000400  2**5 
                  CONTENTS, ALLOC, LOAD, DATA 
 15 .eh_frame     00000004  0804a3c0  0804a3c0  000013c0  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 16 .ctors        00000008  0804a3c4  0804a3c4  000013c4  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 17 .dtors        00000008  0804a3cc  0804a3cc  000013cc  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 18 .got          0000001c  0804a3d4  0804a3d4  000013d4  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 19 .dynamic      000000a0  0804a3f0  0804a3f0  000013f0  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 20 .bss          00000018  0804a490  0804a490  00001490  2**2 
                  ALLOC 
 21 .stab         00000750  00000000  00000000  00001490  2**2 
                  CONTENTS, READONLY, DEBUGGING 
 22 .stabstr      0000134f  00000000  00000000  00001be0  2**0 
                  CONTENTS, READONLY, DEBUGGING 
 23 .comment      0000016e  00000000  00000000  00002f2f  2**0 
                  CONTENTS, READONLY 
 24 .note         00000078  0804a4a8  0804a4a8  0000309d  2**0 
                  CONTENTS, READONLY                   
                   
test2:     file format elf32-i386 
 
Sections: 
Idx Name          Size      VMA       LMA       File off  Algn 
  0 .interp       00000013  080480f4  080480f4  000000f4  2**0 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  1 .note.ABI-tag 00000020  08048108  08048108  00000108  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  2 .hash         0000002c  08048128  08048128  00000128  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  3 .dynsym       00000060  08048154  08048154  00000154  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  4 .dynstr       00000073  080481b4  080481b4  000001b4  2**0 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  5 .gnu.version  0000000c  08048228  08048228  00000228  2**1 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  6 .gnu.version_r 00000020  08048234  08048234  00000234  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  7 .rel.got      00000008  08048254  08048254  00000254  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  8 .rel.plt      00000018  0804825c  0804825c  0000025c  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
  9 .init         0000002f  08048274  08048274  00000274  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, CODE 
 10 .plt          00000040  080482a4  080482a4  000002a4  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, CODE 
 11 .text         000000ec  080482f0  080482f0  000002f0  2**4 
                  CONTENTS, ALLOC, LOAD, READONLY, CODE 
 12 .fini         0000001a  080483dc  080483dc  000003dc  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, CODE 
 13 .rodata       00000008  080483f8  080483f8  000003f8  2**2 
                  CONTENTS, ALLOC, LOAD, READONLY, DATA 
 14 .data         0000000c  08049400  08049400  00000400  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 15 .eh_frame     00000004  0804940c  0804940c  0000040c  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 16 .ctors        00000008  08049410  08049410  00000410  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 17 .dtors        00000008  08049418  08049418  00000418  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 18 .got          0000001c  08049420  08049420  00000420  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 19 .dynamic      000000a0  0804943c  0804943c  0000043c  2**2 
                  CONTENTS, ALLOC, LOAD, DATA 
 20 .bss          00000fc0  080494e0  080494e0  000004e0  2**5 
                  ALLOC 
 21 .stab         00000750  00000000  00000000  000004e0  2**2 
                  CONTENTS, READONLY, DEBUGGING 
 22 .stabstr      0000134f  00000000  00000000  00000c30  2**0 
                  CONTENTS, READONLY, DEBUGGING 
 23 .comment      0000016e  00000000  00000000  00001f7f  2**0 
                  CONTENTS, READONLY 
 24 .note         00000078  0804a4a0  0804a4a0  000020ed  2**0 
                  CONTENTS, READONLY 
 
ps. 더 자세히 공부하고 싶은 분은 아래의 책을 참고하세요 ^^ 
Linkers and Loaders  
John R. Levine  
http://www.wowbook.com/generic/book/info/book_detail.asp?isbn=ISBN1-55860-496-0 
 

728x90