DrawingProcess
드프 DrawingProcess
DrawingProcess
전체 방문자
오늘
어제
«   2025/07   »
일 월 화 수 목 금 토
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
  • 분류 전체보기 (969)
    • Profile & Branding (25)
      • Career (18)
    • IT Trends (254)
      • Conference, Faire (Experien.. (31)
      • News (187)
      • Youtube (19)
      • TED (8)
      • Web Page (2)
      • IT: Etc... (6)
    • Contents (98)
      • Book (67)
      • Lecture (31)
    • Project Process (94)
      • Ideation (0)
      • Study Report (34)
      • Challenge & Award (22)
      • 1Day1Process (5)
      • Making (5)
      • KRC-FTC (Team TC(5031, 5048.. (10)
      • GCP (GlobalCitizenProject) (15)
    • Study: ComputerScience(CS) (72)
      • CS: Basic (9)
      • CS: Database(SQL) (5)
      • CS: Network (14)
      • CS: OperatingSystem (3)
      • CS: Linux (39)
      • CS: Etc... (2)
    • Study: Software(SW) (95)
      • SW: Language (29)
      • SW: Algorithms (1)
      • SW: DataStructure & DesignP.. (1)
      • SW: Opensource (15)
      • SW: Error Bug Fix (43)
      • SW: Etc... (6)
    • Study: Artificial Intellige.. (149)
      • AI: Research (1)
      • AI: 2D Vision(Det, Seg, Tra.. (35)
      • AI: 3D Vision (70)
      • AI: MultiModal (3)
      • AI: SLAM (0)
      • AI: Light Weight(LW) (3)
      • AI: Data Pipeline (7)
      • AI: Machine Learning(ML) (1)
    • Study: Robotics(Robot) (33)
      • Robot: ROS(Robot Operating .. (9)
      • Robot: Positioning (8)
      • Robot: Planning & Control (7)
    • Study: DeveloperTools(DevTo.. (83)
      • DevTool: Git (12)
      • DevTool: CMake (13)
      • DevTool: NoSQL(Elastic, Mon.. (25)
      • DevTool: Container (17)
      • DevTool: IDE (11)
      • DevTool: CloudComputing (4)
    • 인생을 살면서 (65)
      • 나의 취미들 (7)
      • 나의 생각들 (42)
      • 여행을 떠나자~ (10)
      • 분기별 회고 (6)

개발자 명언

“ 매주 목요일마다 당신이 항상 하던대로 신발끈을 묶으면 신발이 폭발한다고 생각해보라.
컴퓨터를 사용할 때는 이런 일이 항상 일어나는데도 아무도 불평할 생각을 안 한다. ”

- Jef Raskin

맥의 아버지 - 애플컴퓨터의 매킨토시 프로젝트를 주도

인기 글

최근 글

최근 댓글

티스토리

hELLO · Designed By 정상우.
DrawingProcess

드프 DrawingProcess

Study: ComputerScience(CS)/CS: Basic

[CS] 링킹(Linking)에 대해 보다 심도있는 내용

2022. 7. 5. 12:02
반응형

링킹(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: 프로그램 실행 도중, 프로그램 외부에 존재하는 코드를 찾아서 연결하는 것입니다.

 

보다 심도 있는 링킹(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" 가 붙은 함수들 끼리는 오버로딩을 할 수 없습니다.
        • 왜냐하면 심볼 생성시 두 함수를 구분할 수 있는 방법이 없기 때문이죠.

링킹 (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
    'Study: ComputerScience(CS)/CS: Basic' 카테고리의 다른 글
    • [Web] 웹 브라우저에 URL을 입력하면 어떤 일이 생기나요? (feat. Amazon)
    • [CS] 캐시(Cache)란?
    • [CS] 컴파일(Compile)에 대해 보다 심도있는 내용
    • [CS] 래퍼(Wrapper) 클래스란?
    DrawingProcess
    DrawingProcess
    과정을 그리자!

    티스토리툴바