본문 바로가기
정글

TIL(15일차) 링커

by 진득한진드기 2023. 5. 6.

오늘은 링커에 대해 간단히 공부했다.

 

먼저 링커를 알기 전 링킹(Linking)에 대해 알아보자

 

링킹

 

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

 

컴파일시 수행되고 소스코드가 머신머신코드로 변환된다.

 

옛날에는 수동으로 했지만 이 링킹 작업을 현재는 링커가 자동으로 해준다.

 

 

링커는 왜 중요할까?

 

링커는 독립적인 컴파일을 가능하게 한다.

 

큰 규모의 응용프로그램을 한 개의 소스 파일로 구성하는 대신 별도로 수정 할 수있고, 컴파일할 수 있는 보다 관리가 편한 규모의 작은 모듈로 나눈다.

 

링커를 이해하는 것은 큰 프로그램을 작성하는데 도움이 된다.

 

링커를 이해해야되는 이유를 5가지를 보면 다음과 같다.

 

1. 큰 프로젝트 할때 직접 라이브러리를 작성하거나 할때 맞는 라이브러리가 무엇인지 링커가 참조를 해결하기 위해 라이브러리를 사용하는지 이해하지 못한다면 굉장한 혼란스러운 상황을 맞이한다.

 

2. 링커를 이해하면 위험한 에러를 피할 수 있게 된다. 리눅스 링커가 심볼 참조를 해겨랗ㄹ 때는 결정들은 프로그램의 정확성에 미미한 영향을 줄 수 있다. 전역변수를 중복해서 정의한 프로그램도 기본설정의 경우 경고 메시지 없이 링커를 통과 할 수 있게 되기 때문에

혼란스러운 동작을 보여준다.

 

3. 링킹을 이해하면 언어의 변수 영역 규칙이 구현되었는지 이해하는데 도움이 된다.

 

4. 링킹에 대해서 이해하면 다른 중요한 시스템 개념을 이해할 수 있게 된다.

링커가 만든 실행가능 객체 파일은 로딩과 프로그램 실행과 같은 중요한 시스템 함수, 가상메모리, 페이징, 메모리 매핑에 중요한 역할을 하게 된다.

 

5. 공유 라이브러리에 대해 이해할 수 있다. 현대 운영체제에서 공유 라이브러리와 동적 링킹의 중요성이 높아져 복잡한 프로세스가 되었다.

예를 들어 많은 소프트웨어 제품들은 공유 라이브러리를 사용해서 크기가 줄어든 바이너리를 런타임에 업그레이드 할 수 있게 해준다.

 

 


 

재배치 가능 목적파일

 

 

위 그럼은 전형적인 ELE 재배치 가능 목적파일이다.

 

ELF header는 파일을 생성한 워드 크키와 시스템의 바이트 순서를 나타내는 16바이트 배열로 시작한다.

 

다른 여러가지 섹션들의 위치와 크기는 섹션 헤더 테이블로 나타내고, 각자 고정된 크기의 엔트리를 갖는다.

 

엔트리에 대한 설명은 다음과 같다.

 

  • .text : 컴파일된 프로그램의 머신 코드
  • .rodata : printf 문장의 포맷 스트링, switch문의 점프 테이브로가 같은 읽기-허용데이터
  • .data = 초기화된 C 전역변수 및 정적변수
  • .bss = 초기화되지않은 C 전역변수와 0으로 초기화된 정적,전역변수
  • .symtab = 프로그램에서 정의되고 참조되는 전역변수들과 함수에 대한 정보를 가지고 있는 심볼 테이블
  • .rel.text = 링커가 이 목적파일을 다른 파일들과 연결할 때 수정되어야 하는 .text 섹션 내 위치들의 리스트
  • .rel.data = 이 모듈에 의해 정의되거나 참조되는 전역변수들에 애한 재배치 정보.
  • .debug = 프로그램 내에서 정의된 지역변순들과 typedef, 프로그램과 최초 C소스 파일에서 정의되고 참조된 전역변수들을 위한 엔트리를 갖는 심볼 테이블
  • .line = 최초 C 소스프로그램과 .text 섹션 내 머신 코드 인스트럭션 내 라인 번호들간의 매핑
  • .strtab = .strtab과 .debug 섹션들 내에 있는 심볼 테이블과 섹션 헤더들에 있는 섹션 이름들을 위한 스트링 테이블

 

'정글' 카테고리의 다른 글

TIL(17일차) 레드블랙트리 삽입  (0) 2023.05.08
TIL(16일차) 포인터 디테일  (0) 2023.05.07
TIL(14일차) 메모리누수  (0) 2023.05.05
TIL(13일차) re : 프로시저  (0) 2023.05.04
TIL(12일차) 플로이드 워샬 알고리즘  (0) 2023.05.03