[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)는 다르다.
댓글 없음:
댓글 쓰기