compile은 인간이 이해할 수 있는 언어로 작성된 소스 코드(고수준 언어 : C, C++, Java 등)를
CPU가 이해할 수 있는 언어(저수준 언어 : 기계어)로 번역(변환)하는 작업을 말한다.
compiler는 이러한 작업을 해주는 프로그램을 말한다.
소스코드(example.c) -> 전처리된 소스코드 파일(example.i)
이 과정에서 크게 3가지 작업 수행
전처리된 소스코드 파일(example.i) -> 어셈블리어 파일(example.s)
어셈블리어 파일(example.s) -> 오브젝트 파일(example.o)
오브젝트 파일?
어셈블러를 통해 변환된 어셈블리 코드는 이제 더 이상 사람이 알아볼 수 없는 기계어로 변환되는데 이를 오브젝트 코드(목적코드)라 부르고, 오브젝트 코드로 구성된 파일을 오브젝트 파일(Object File)이라 부른다. 이 오브젝트 파일은 특정한 파일 포맷을 가진다. (Windows의 경우 PE(Portable Executable), Linux의 경우 ELF(Executable and Linking Format))
링커(Linker)를 통해 오브젝트 파일(*.o)들을 묶어 실행 파일로 만드는 과정
오브젝트 파일들과 프로그램에서 사용하는 라이브러리 파일들을 링크하여 하나의 실행 파일을 만든다.
Dynamic Link 방식은 라이브러리가 프로그램 외부에 있기 때문에 함수의 주소를 알아오는 과정이 필요하다.
printf -> PLT -> GOT
출처: https://bpsecblog.wordpress.com/2016/03/07/about_got_plt_1/