리눅스2012. 3. 2. 18:02

출처: Secure Coding in C and C++


Linux 의 기본 바이너리 포맷은 ELF(Executable and Linking Format)이다.  ELF는 원래 UNIX System Laboratories(USL)에 의해 ABI(Application Binary Interface)의 일환으로 개발되었다.


ELF 파일의 프로세스 공간은 GOT(Global Offset Table)을 포함하고 있는데, 이 GOT는 절대 주소값을 가지고 있다.  이렇게 절대 주소값을 가지고 있을 경우, 코드 영역의 위치여부나 공유여부에 상관없이 사용 할 수 있게 된다.


실제 테이블의 내용이나 형태는 프로세서의 종류에 따라 다를 수 있지만,   기본적으로 GOT는 다이나믹 링킹 프로세스를 지원하는데 있다.


프로그램에 의해 사용되는 모든 라이브러리 함수는 GOT에 실제 함수의 주소를 가진 엔트리를 가지고 있으며, 이는 라이브러리가 쉽게 프로세스 메모리 안에서 재배치될 수 있게 한다.  프로그램이 실제로 함수를 처음으로 사용하기 전까지는, GOT의 엔트리에는 RTL(RunTime Linker)의 주소를 가지고 있다.  만약 프로그램에 의해 함수가 호출되면, RTL에게 제어는 넘어가며, 함수의 실제 주소가 GOT에 등록된다.  차후의 함수 호출은 RTL을 거칠 필요 없이 GOT를 통해서 호출된다.


GOT 엔트리의 주소는 EFL 파일의 고정된 위치에 있고, 결과적으로 모든 실행 프로세스 이미지들에게 공통적인 주소에 있게 된다.  GOT 엔트리의 위치를 알려면, 'objdump' 커맨드를 사용하여 확인 할 수 있다.
 



'리눅스' 카테고리의 다른 글

ext4분석  (0) 2012.04.10
EXT4 파일 시스템 굽기(2)  (0) 2012.03.18
리눅스 배포판 이름 버젼 알아내기  (0) 2012.03.02
/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin, /opt  (0) 2012.02.24
Linux: umask  (0) 2012.01.03
Posted by code cat