반응형
링킹(Linking) 과정이란? (지난 강의 참조)
- A와 B 소스파일이 있을 때, 각각 compile만 하면 A가 B에 존재하는 함수(메서드)를 찾을 수 없어 호출할 수가 없습니다.
따라서, A와 B를 연결해주는 작업이 필요한데 이를 Linking라 합니다. - 여러 개로 분리된 compile한 소스파일들을 최종 실행 가능한 파일로 만들기 위해 필요한 부분을 찾아서 연결해주는 작업입니다.
- 주로 사용하는 실행 파일 형태는 Portable Executable 이라 불리는 PE 파일 형식의 파일을 생성하게 됩니다.
- 윈도우 계열: *.exe
- 리눅스 계열: *.ELF (Executable and Linkable Format)
- 맥 계열: *.pkg *.dmg
- Link는 정적링크(static link)와 동적링크(dynamic link)가 있습니다.
- static link: compile된 소스파일들을 연결해서 최종 실행 가능한 파일을 만드는 것입니다.
- dynamic link: 프로그램 실행 도중, 프로그램 외부에 존재하는 코드를 찾아서 연결하는 것입니다.
- 주로 사용하는 실행 파일 형태는 Portable Executable 이라 불리는 PE 파일 형식의 파일을 생성하게 됩니다.
보다 심도 있는 링킹(Linking) 이란?
저장 기간 (Storage duration) - automatic, static, thread
저장 방식 지정자 (Storage class specifier)에 따른 '객체'들의 저장기간
- automatic: 따로 저장 방식을 지정하지 않았을때에 해당하며, 보통 {} 를 빠져나가게 되면 자동으로 소멸합니다.
- static: static으로 정의된 객체들이 해당되며, 프로그램이 시작할 때 할당되고 프로그램이 끝날 때 소멸됩니다.
- thread: thread_local로 정의된 객체들이 해당되며, 쓰레드가 시작할 때 할당되고 쓰레드가 종료될 때 소멸됩니다.
- dynamic: new와 delete로 정의된 객체들이 해당되며, 동적으로 할당되고 해제하면 소멸됩니다.
링크 방식 (Linkage) - internal, external
- automatic: 따로 저장 방식을 지정하지 않았을때에 해당하며, 보통 {} 안에서만 참조할 수 있습니다.
- static: static으로 정의된 개체들은 내부 링크 방식으로 같은 TU 안에서만 참조 가능합니다. 그 외에도 namespace에 정의된 함수나 변수들 모두 내부 링크 방식이 적용됩니다.
- extern: extern으로 정의한 개체들은 외부 링크 방식으로 다른 TU 에서도 참조 가능합니다. 참고로 외부 링크 방식으로 정의된 개체들에 언어 링크 방식 을 정의할 수 있어서, 다른 언어 (C 와 C++) 사이에서 함수를 공유하는 것이 가능해집니다.
이름 맹글링 (Name Mangling)
- 앞서 C 에서 C++ 의 함수를 사용하기 위해서는 extern "C" 로 언어 링크 방식을 명시해주어야 한다고 하였습니다. 그 이유는, 목적파일 생성시 C 컴파일러가 함수 이름을 변환하는 방식과 C++ 컴파일러가 함수 이름을 변환하는 방식이 다르기 때문입니다.
그렇다면 앞서 설명했던 extern으로 다른 언어 사이에 함수를 어떻게 공유하는 걸까요?- C 의 경우, 컴파일하면 목적 코드 생성시에 함수 이름 변환 자체가 이루어 지지 않습니다.
- C++ 의 경우, 컴파일하면 함수의 이름을 바꾸는 것을 볼 수 있으며, 이를 이름 맹글링 (Name Mangling)이라 합니다.
- 왜 C++에서는 컴파일하면 함수의 이름을 바꿀까요? (이름 맹글링을 하는 이유)
- C 와는 다르게 C++ 에서는 같은 이름의 함수를 정의할 수 있기 때문입니다.
- 함수의 오버로딩을 통해서 인자가 다른 같은 이름의 함수들을 정의할 수 있으며,
- 인자와 이름이 모두 똑같더라도 다른 이름 공간에 들어가 있다면 다른 함수로 취급됩니다.
- 따라서 같은 이름의 함수일지라도, 이름 맹글링을 거치고 다면 다른 이름의 함수로 바뀌기 때문에 링킹을 수행할 수 있습니다.
- 추가로, 앞서 설명했던 extern으로 선언하게 되면 이름 맹글링이 되지 않는 함수 심볼을 생성할 수 있어 다른 언어간에 함수를 공유할 수 있게 됩니다.
- 따라서, 당연히도 extern "C" 가 붙은 함수들 끼리는 오버로딩을 할 수 없습니다.
- 왜냐하면 심볼 생성시 두 함수를 구분할 수 있는 방법이 없기 때문이죠.
- 추가로, 앞서 설명했던 extern으로 선언하게 되면 이름 맹글링이 되지 않는 함수 심볼을 생성할 수 있어 다른 언어간에 함수를 공유할 수 있게 됩니다.
- C 와는 다르게 C++ 에서는 같은 이름의 함수를 정의할 수 있기 때문입니다.
링킹 (Linking)
- 링킹(Linking): 각각의 TU 들에서 생성된 목적 코드들을 한데 모아서 하나의 실행 파일 을 만들어내는 작업입니다.
재배치 (Relocation) - R_X86_64_PC32, R_X86_64_PLT32 등
정적 링킹 (Static linking)
동적 링킹 (Dynamic linking)
참고
- [씹어먹는 C++]: 코드 부터 실행 파일 까지 https://modoocode.com/319
- [씹어먹는 C++]: 코드 부터 실행 파일 까지: 링킹 https://modoocode.com/321
반응형
'Study: ComputerScience(CS) > CS: Basic' 카테고리의 다른 글
[Web] 웹 브라우저에 URL을 입력하면 어떤 일이 생기나요? (feat. Amazon) (0) | 2022.07.19 |
---|---|
[CS] 캐시(Cache)란? (0) | 2022.07.06 |
[CS] 컴파일(Compile)에 대해 보다 심도있는 내용 (0) | 2022.07.05 |
[CS] 래퍼(Wrapper) 클래스란? (0) | 2022.07.04 |
[CS] 컴파일(Compile), 링킹(Linking), 빌드(Build), 배포(Release, Deploy, Distribute) 란? (0) | 2022.06.17 |