정적라이브러리 제작 (명령어ver)
순서
-
오브젝트 작성
gcc -c *.c
-
ar 명령 이용해서 라이브러리 아카이브 만들기
- flags
-r : 라이브러리 아카이브에 새로운 오브젝트를 추가할것
-c : 아카이브가 존재하지 않을경우 생성하라는 옵션
ar rc libft.a *.o
-
컴파일
compile
- 정의
- 인간이 이해할 수 있는 언어(고수준 언어 : C, C++, Java)로 작성된 소스코드를 CPU가 이해할 수 있는 언어(저수준 언어 : 기계어)로 번역하는 작업
- 소스코드 -----> 실행파일(실행시 운영체제의 Loader를 통해 메모리에 적재 후 프로그램 동작)
- 컴파일 과정
- 전처리
- 전처리기를 통해 소스코드파일(.c)를 전처리된 소스코드 파일(.i)로 변환하는 과정
- 주석제거, 헤더파일 삽입(소스 코드 파일 내에 복사 - 링킹과정을 통해 오브젝트파일과 결합), 매크로 치환 및 적용(#define 지시문의 내용으로 치환)
- 컴파일
- 컴파일러를 통해 전처리된 소스 코드 파일(.i)을 어셈블리어 파일(.s)로 변환하는 과정
- 언어의 문법 검사 및 static영역에 대한 메모리 할당 수행
- 컴파일러
- (프론트엔드 - 미들엔드 - 백엔드)
1. 프론트엔드 : 언어 종속적인 부분 처리
소스코드의 어휘/구문/의미분석, 미들엔드에 넘겨주기 위한 GIMPLE트리(소스코드를 트리 형태로 표현한 자료 구조) 생성
2. 미들엔드 : 아키텍쳐 비종속적인 최적화 수행
CPU 아키텍쳐에 관계 없이 할 수 있는 최적화
프론트엔드에서 넘겨받은 GIMPLE 트리를 이용해 최적화 후 백엔드에서 사용하는 RTL(Register Transfer Language: 고급어와 어셈블리어의 중간 형태)
3. 백엔드 : 아키텍쳐 종속적인 최적화
아키텍쳐 특성에 따라 최적화 수행
RTL을 이용해 최적화를 수행하고 어셈블리코드 생성
4. 어셈블리어 : CPU마다 고유하게 가지고 있는 이진수로 이루어진 명령어
사람이 이해할 수 있게 부호화한 것이 어셈블리어
어셈블리어는 기계어와 1:1 매칭
gcc의 경우 프론트/미들/백 단계가 서로 의존성을 가짐. clang(프론트엔드)+LLVM(미들엔드,백엔드)는 단계가 잘 분리되어 있음.
-
어셈블리
어셈블러를 통해 어셈블리어 파일(.s)을 오브젝트파일(.o)로 변환하는 과정.+ object file
1. 정의 : 오브젝트코드로 구성된 파일
2. 포맷 : 오브젝트파일헤더, 텍스트섹션, 데이터섹션, 심볼테이블섹션, 재배치정보섹션, 디버깅정보섹션
3. 심볼 : 함수나 변수를 식별할 때 사용하는 이름
함수를 구현한 오브젝트 파일을 실행하기 위해서는 함수를 사용하는 오브젝트 파일과 함수를 구현한 오브젝트 파일을 연결시키는 작업이 필요 == 링킹과정
-
링킹
링커를 통해 오브젝트 파일을 묶어 실행파일로 만드는 과정