[CSAPP 7장 완전 정복] 7.12 공유 라이브러리의 핵심 기술 - PIC, GOT, PLT

2025. 4. 18. 15:28·크래프톤 정글/컴퓨터구조(CSAPP)

공유 라이브러리의 핵심 기술 - PIC, GOT, PLT

공유 라이브러리(.so)는 단순한 코드 파일이 아니라, 메모리 어디에 올라가도 제대로 작동할 수 있어야 하는 특별한 코드여야 하는데요. 그래야만 여러 프로그램이 같은 공유 라이브러리를 함께 사용할 수 있기 때문입니다. 그리고 그것을 가능하게 해주는 핵심 기술이 바로 PIC(Position-Independent Code), GOT(Global Offset Table), PLT(Procedure Linkage Table)입니다.

 

이번 글에서는 CSAPP 7.12절 내용을 바탕으로 이 기술들이 왜 필요하고, 어떻게 동작하는지를 쉽게 풀어봅니다.

 

 

어디에 올라가도 잘 작동하는 코드, PIC

PIC(Position-Independent Code)는 말 그대로, 자기 자신이 메모리 어디에 올라가든 동작 가능한 코드입니다. 공유 라이브러리(.so)는 여러 프로그램이 함께 쓰기 위해 항상 같은 주소에 로드되지 않기 때문에, 코드가 자신의 위치를 모르는 상태로 동작해야 합니다.

 

이렇게 작동하기 위해서는 우선 절대 주소 사용이 금지되고, 대신 현재 위치를 기준으로 상대 주소를 계산하는 방식을 사용합니다. 그리고 변수나 함수 주소는 직접 쓰지 않고 테이블(GOT, PLT)을 통해 간접적으로 접근하게 되죠.

 

이렇게 상대적으로 접근하는 방식을 명령어로 나타내면 아래와 같습니다.

mov x(%rip), %rax     # 현재 명령 위치로부터 상대적 접근

실제로 .so 파일은 항상 PIC로 컴파일되어, 메모리의 공유 라이브러리 영역에 올라가도 안정적으로 동작합니다.

 

 

외부 심볼 주소를 모아둔 주소록, GOT

GOT(Global Offset Table)은 PIC 코드가 외부 심볼(전역 변수 등)에 접근할 수 있도록 주소를 저장해 둔 테이블, 즉 주소록 역할을 합니다. GOT가 필요한 이유는, PIC에서는 변수의 절대 주소를 하드코딩할 수 없기 때문인데요.

 

처음 실행 시 GOT에 외부 변수들의 실제 주소가 기록되고, 이후 PIC 코드가 항상 GOT를 통해 간접적으로 변수들의 주소를 참조하게 됩니다.

 

GOT에서 특정 변수의 주소를 불러오는 명령어는 아래와 같습니다.

movq x@GOTPCREL(%rip), %rax   # x의 주소를 GOT에서 불러오기

곧 GOT가 있기 때문에, 코드가 어디에 있든 변수의 위치를 안전하게 참조할 수 있습니다.

 

 

외부 함수 호출을 중계해주는 교환원, PLT

함수 호출도 마찬가지입니다. 함수의 주소도 컴파일 시 확정할 수 없기 때문에, 처음 호출 시 주소를 찾아 연결해주는 중계소가 필요한데 이 역할을 PLT가 맡게 됩니다.

 

PLT 동작 원리, 지연 바인딩(Lazy Binding)

  1. 처음 호출 시 PLT가 동적 링커에게 함수 주소를 요청
  2. 링커가 실제 함수 주소를 찾아 GOT에 기록
  3. 이후 호출부터는 PLT가 GOT를 통해 빠르게 해당 함수로 점프

PLT를 통해 함수를 호출하는 명령어는 다음과 같습니다.

jmp foo@PLT   # PLT를 통해 foo 함수 호출

 

PLT의 특징

  • 단순한 테이블이 아닌 실제 실행 가능한 어셈블리 점프 코드이다
  • .plt 섹션에는 각 함수에 대한 중계 루틴이 들어 있다
  • 이를 통해 구현되는 것이 바로 Lazy Binding (지연 결합)으로, 사용하지 않는 함수는 처음 호출될 때만 연결된다.

PLT + GOT 요약 흐름

역할 설명
GOT 외부 심볼(변수, 함수) 주소를 저장하는 주소록
PLT 외부 함수 호출을 중계하는 실행 코드
관계 PLT는 GOT를 통해 주소를 얻고, 링커는 GOT를 통해 주소를 갱신한다

결국, 코드는 PLT를 통해 함수를 호출하고, 변수는 GOT를 통해 접근하면서 어디에 로드되어도 동작이 가능한 PIC의 특성을 유지하게 됩니다.

 

핵심 요약

  • PIC는 위치 독립 코드로, 어디에 로드되어도 동작이 가능한 코드이다
  • GOT는 외부 변수 주소를 저장한 테이블, 주소록이다
  • PLT는 함수 호출을 중계하는 코드로써 교환원, 중계소의 역할을 한다
  • Lazy Binding은 처음 호출될 때만 연결하는 지연 연결 전략이다
저작자표시 비영리 변경금지 (새창열림)

'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글

[CSAPP 7장 완전 정복] 7.14~7.15 오브젝트 파일 분석과 실행 흐름 마무리  (0) 2025.04.18
[CSAPP 7장 완전 정복] 7.13 라이브러리 삽입 완전 이해하기  (0) 2025.04.18
[CSAPP 7장 완전 정복] 7.10~7.11 정적 링크 vs 동적 링크, 라이브러리 연결의 두 방식  (0) 2025.04.18
[CSAPP 7장 완전 정복] 7.7~7.9 링커의 마지막 퍼즐 - 재배치, 실행 가능 목적 파일, 그리고 로딩  (0) 2025.04.18
[CSAPP 7장 완전 정복] 7.5~7.6 심볼 테이블과 심볼 해석, 링커의 두뇌를 들여다보다  (0) 2025.04.17
'크래프톤 정글/컴퓨터구조(CSAPP)' 카테고리의 다른 글
  • [CSAPP 7장 완전 정복] 7.14~7.15 오브젝트 파일 분석과 실행 흐름 마무리
  • [CSAPP 7장 완전 정복] 7.13 라이브러리 삽입 완전 이해하기
  • [CSAPP 7장 완전 정복] 7.10~7.11 정적 링크 vs 동적 링크, 라이브러리 연결의 두 방식
  • [CSAPP 7장 완전 정복] 7.7~7.9 링커의 마지막 퍼즐 - 재배치, 실행 가능 목적 파일, 그리고 로딩
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기 N
      • 크래프톤 정글
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리)
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어)
        • Equipped in 정글(나만무)
        • 마이 정글(WIL, 에세이)
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • Flutter N
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[CSAPP 7장 완전 정복] 7.12 공유 라이브러리의 핵심 기술 - PIC, GOT, PLT
상단으로

티스토리툴바