[CSAPP] Linker 7.1

JunHyeok Kim·2024년 4월 22일

Linking

  • 링킹(Linking)은 여러개의 데이터와 코드를 모아 연결하여 메모리에 업로드 될 수 있고 실행할 수 있는 한 개의 파일로 만드는 작업입니다.

링킹은 컴파일 시, 로드타임 심지어 런타임에도 실행 될 수 있습니다. 현대 시스템에서 링킹은 링커라고 부르는 프로그램에 의해 자동으로 실행됩니다!

현재 내가 작성하는 프로그램의 경우에는 규모가 작아서 체감하기 힘들다. 하지만 거대한 규모를 가진 프로그램의 경우에는 수정된 모듈 단위의 파일만 재컴파일하고 다른 파일들은 재컴파일 할 필요가 없기 때문에 '링킹' 이라는 것을 알아야 한다.

링커를 이해하면 비로소 보이는 것들.

  1. 큰 규모의 프로그램을 작성하는 데 도움이 된다. 종종 맞지 않은 라이브러리 버전 때문에 링커 에러가 발생하는데, 이 링커 참조를 어떻게 해결하는지 이해 못하면 링커관련 문제 해결에 있어서 곤혹스러울 것 이다.

  2. 전역변수를 중복 선언한 여러 프로그램들 모듈들이 경고 메시지 없이 링커를 통과할 수 있으며, 이 경우에는 디버깅하기가 매우 어려울 것이다. 링커를 배움으로써 이를 어떻게 회피할 수 있는지 알 수 있다.

  3. 링킹을 이해하면 언어의 변수 영역 규칙을 이해하는 데 도움이 된다. 전역변수와 지역변수의 차이, static을 통한 변수나 함수의 선언의 차이를 알 수 있다.

  4. 링킹을 이해하면 다른 시스템 개념을 이해할 수 있다. 가령 링커가 만든 실행 가능 객체 파일은 로딩과 프로그램 실행 같은 중요 시스템 함수, 가상메모리, 페이징, 메모리 매핑에서 중요한 역할을 한다.

  5. 링킹을 이해하면 공유 라이브러리에 대해 이해할 수 있다.

7.1 컴파일러 드라이버

그림과 같은 두 개의 소스코드는

위와 같이 Linker (ld) 에 의해 실행 가능한 파일로 연결된다.

0개의 댓글