Compile & PLT & GOT

동글래차·2023년 6월 16일
0

system

목록 보기
1/4

선행지식!!!

compile


compile?

compile은 인간이 이해할 수 있는 언어로 작성된 소스 코드(고수준 언어 : C, C++, Java 등)를
CPU가 이해할 수 있는 언어(저수준 언어 : 기계어)로 번역(변환)하는 작업을 말한다.
compiler는 이러한 작업을 해주는 프로그램을 말한다.
compile

compile 과정


1. 전처리

소스코드(example.c) -> 전처리된 소스코드 파일(example.i)

이 과정에서 크게 3가지 작업 수행

  • 주석 제거
  • 헤더 파일 삽입
  • 매크로 치환 및 적용

2. 컴파일

전처리된 소스코드 파일(example.i) -> 어셈블리어 파일(example.s)
  • 문법검사

3. 어셈블리

어셈블리어 파일(example.s) -> 오브젝트 파일(example.o)

오브젝트 파일?

어셈블러를 통해 변환된 어셈블리 코드는 이제 더 이상 사람이 알아볼 수 없는 기계어로 변환되는데 이를 
오브젝트 코드(목적코드)라 부르고, 오브젝트 코드로 구성된 파일을 오브젝트 파일(Object File)이라 
부른다. 이 오브젝트 파일은 특정한 파일 포맷을 가진다. 
(Windows의 경우 PE(Portable Executable), Linux의 경우 ELF(Executable and Linking Format))

4. Linking

  • 링커(Linker)를 통해 오브젝트 파일(*.o)들을 묶어 실행 파일로 만드는 과정

  • 오브젝트 파일들과 프로그램에서 사용하는 라이브러리 파일들을 링크하여 하나의 실행 파일을 만든다.

    • 4.1 Static link
      - 정적 라이브러리는 정적 링킹(Static Linking) 과정에서 링커가 프로그램에 필요로 하는 부분을 라이브러리에서 찾아 실행 파일에 복사하는 방식의 라이브러리를 의미한다.
    • 4.2 Dynamic link
      - 링커가 라이브러리 내용을 복사하지 않고 해당 내용의 주소만 가지고 있다가 런타임에 실행 파일과 라이브러리가 메모리에 위치할 때 해당 주소로 가서 필요한 내용을 가져오는 방식의 라이브러리를 의미한다.

      PLT와 GOT는 Dynamic Link 방식으로 컴파일 했을 때 사용하는 동적 라이브러리 참조 주소이다!

PLT & GOT


Dynamic Link 방식은 라이브러리가 프로그램 외부에 있기 때문에 함수의 주소를 알아오는 과정이 필요하다.

printf -> PLT -> GOT

출처: https://bpsecblog.wordpress.com/2016/03/07/about_got_plt_1/

profile
동글동글

0개의 댓글

관련 채용 정보