2018년 5월 25일 금요일

c언어의 기본 실행 과정 구조

[1] 소스파일(a.c) 
c언어

[1.5] 컴파일러 
c언어로 된 파일을 어셈블리어로 번역한다.

[2] 소스파일(a.S) 
어셈블리어
최초로 세그먼트구분이 이루어 진다

[2.5] 어셈블러
어셈블리어로 작성된 파일을 CPU가 직접 이해할 수 있는 Native Code로 번역한다.

[3] 목적파일(a.o) 
네이티브코드
재배치가능구조
역시 세그먼트구조이다

[3.5] 링커 
재배치가능한 파일들(목적파일)을 함치는 역할을 한다
main함수를 text세그먼트 맨 앞으로 위치시키며
전역변수주소와 함수주소등을 참조하고 있는 부분을 재배치된 결과를 반영해서 다시 수정한다.
각종라이브러리와의 연결도 여기서 처리된다.

1) 정적 라이브러리 ( 리눅스 - *.a / 윈도우 - *.lib ) :
프로그램 이미지에 포함되어 컴파일 된다.

2) 동적 라이브러리 ( 리눅스 - *.so / 윈도우 - *.dll) :
프로그램이 실행되기 직전에 참조하는 외부 함수 주소 부분이 LOADER에 의해 재배치 된다.
동적라이브러리는 메모리에 항상 올라가 있으며 모든 프로세스가 공유한다.
프로세스가 생성될 때 현재 메모리에 올라가 있는 dll주소와 현재 프로세스의 페이지 디렉토리 구조의 일부를 연결시킨다.

[4] 실행파일(a.out) 
재배치된결과물
운영체제의 로더에의해 메모리에 올려지고 코드가 실행된다

ps : 어셈블리어(Assembly Language)와 어셈블러(Assembler)는 다르다.

댓글 없음:

댓글 쓰기