호우동의 개발일지

Today :

article thumbnail

링커(Linker)와 로더(Loader)

  • 프로그램은 디스크에 이진 실행 파일(ex : a.out, prog.exe)로 존재해야 함
    • 소스 파일은 임의의 물리 메모리 위치에 적재되도록 설계된 오브젝트 파일로 컴파일됨
      • 이러한 형식의 파일을 재배치 가능 오브젝트 파일이라고 불림

  • 프로그램을 CPU에서 실행하는 절차를 설명할 예정
    • CPU에서 실행하려면, 프로그램을 컴파일하고 메모리로 가져와 프로세스 형태로 배치해야 함

링커와 로더의 역할
링커와 로더의 역할

  • 링커 : 재배치 가능 오브젝트 파일을 하나의 이진 실행 파일로 결합
    • 링킹 단계에서 다른 오브젝트 파일 또는 라이브러리 포함될 수 있음
      • 표준 C 라이브러리, 수학 라이브러리 등

  • 로더 : 이진 실행 파일을 메모리에 적재
    • 프로그램 부분에 최종 주소를 할당, 프로그램 코드와 데이터를 해당 주소와 일치하도록 조정
    • 프로그램이 실행될 때, 코드가 라이브러리 함수를 호출하고 변수에 접근할 수 있도록 함
    • 실제 대부분의 시스템은 프로그램을 적재할 때 라이브러리를 동적으로 링크
      • Windows는 동적 링킹 라이브러리(DLL)를 지원

 


로더가 호출되는 과정(위 그림)

  1. 명령어 라인에 실행 파일의 이름 입력(./main)
  2. 셸은 fork() 시스템 콜을 사용하여 프로그램을 실행하기 위한 새 프로세스 생성
  3. 이후, exec() 시스템 콜로 로더를 호출하고 exec()에 실행 파일 이름 전달
  4. 로더는 새로 생성된 프로세스의 주소 공간을 사용하여 지정된 프로그램을 메모리에 적재

 


동적 링킹 라이브러리(DLL)

  • 장점
    • 실행 파일에서 사용되지 않는 라이브러리를 링크하고 로드하지 않아도 된다.
      • 대신 라이브러리는 조건부로 링크되며 프로그램 실행 시간에 필요한 경우 적재
      • 프로그램이 적재될 때 동적으로 링크되고 적재될 수 있도록 재배치 정보를 삽입
      여러 프로세스가 동적으로 링크된 라이브러리를 공유 가능하여, 메모리 사용을 크게 절약

 


ELF(Executable and Linkable Format)

  • UNIX 및 Linux 시스템에서 가지는 오브젝트 및 실행 파일의 표준 형식
    • 오브젝트 파일 및 실행 파일은 일반적으로 표준화된 형식을 가진다.
    • 표준형식은 컴파일된 기계 코드 및 프로그램에서 참조되는 메타데이터를 가진 기호 테이블을 포함
  • 재배치 가능 파일과 실행 가능 파일은 별도의 ELF 형식이 사용
    • 실행 가능 파일의 ELF 파일의 정보 중 하나는 프로그램의 시작점
      • 프로그램을 실행할 때 실행할 첫 번째 명령어의 주소거 저장되어 있음
  • Windows 시스템은 PE(Portable Executable) 형식 사용
  • macOS는 Mach-O 형식 사용