240211_링커

추성결·2024년 2월 11일
0

참조: https://it-eldorado.tistory.com/49

링킹이란

  • 여러개의 코드와 데이터를 모아서 연결하여 메모리에 로드될 수 있고 실행될 수 있는 한개의 파일로 만드는 작업.

링커는 소프트웨어 개발 시에 중요한 역할을 수행하는데, 이들이 독립적인 컴파일을 가능하게 한다. (모듈화를 할때, 중요한 역할을 한다.)

컴파일러 드라이버

  • 대부분의 컴파일 시스템은 사용자를 대신해서 언어 전처리기, 컴파일러, 어셈블러, 링커를 필요에 따라 호출하는 컴파일러 드라이버를 제공한다.

드라이버 동작 내용

해당 그림은 정적연결의 예시이다.

1. 먼저 C 전처리기(cpp)를 돌리고, main.i로 변역한다.
2. C 컴파일러(cc1)를 돌려서 ASCII 어셈블리 언어 파일인 main.s로 번역한다.
3. 어셈블러(as)를 돌려서 바이너리 목적파일인 main.o로 번역한다.
4. 그 후, 링커 프로그램(ld)를 실행하는데, 위 그림에서 예로 들면, 필요한 시스템 목적파일들과 함께 실행 가능 목적파일 prog를 생성하기 위해 main.o와 sum.o를 연결한다.

정적연결

  • 실행파일을 만들기 위해서 링커는 두 가지 주요 작업을 수행해야 한다.

1. 심볼 해석

  • 각 심볼은 함수, 전역변수 또는 정적변수(즉, C언어에서 static으로 선언된 모든 변수들)에 대응된다.(static으로 선언되지 않은 지역변수는 런타임에 stack영역에 저장되기 때문에 이는 포함하지 않는다.)
  • 심볼해석의 목적은 각각의 심볼 참조를 정확하게 하나의 심볼 정의에 연결하는 것이다.

2. 재배치

  • 프로그램이 로드되는 메모리의 주소가 실행 시간에 결정되기 때문에 재배치가 필요하다.
  • 링커는 '재배치 엔트리(엔트리: 보통 데이터나 주소의 정보를 담고있다.)' 내에 담겨있는 정보에 따라 이 심볼들로 가는 모든 참조들을 수정해서 이들이 이 메모리 위치를 가리키도록 재배치한다.

재배치 가능 목적파일

  • 위 ELF포맷을 따르는 재배치 가능 오브젝트 파일의 내부 구조를 나타낸다.

실행 가능 목적파일의 로딩

  • 로딩 과정에서 컴파일 및 링크 과정이 진행되고, 프로그램을 실행한다.

  • 쉘은 로더라고 알려진 메모리 상주 운영체제 코드를 호출해서 이 프로그램을 실행한다.

로더는 디스크로부터 실행 가능한 목적파일 내의 코드와 데이터를 메모리로 복사하고 이 프로그램의 첫 번째 인스트럭션, 즉 엔트리 포인트로 점프해서 프로그램을 실행한다.

  • 이와 같이 프로그램을 메모리로 복사하고 실행하는 과정을 로딩이라고 부른다.

0개의 댓글