Notice
Recent Posts
Recent Comments
«   2025/09   »
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
Archives
Today
Total
관리 메뉴

채록채록

[Algorithm] c++, static, compiler, static linkage, memory 본문

Algorithm

[Algorithm] c++, static, compiler, static linkage, memory

김책은 2025. 7. 22. 08:14


백준 문제 풀다가 static을 컴파일러가 어떻게 처리하길래 전역 변수와 같은 영역의 메모리 데이터 세그먼트에 저장되는지 궁금해져서 지피티에게 물어본 내용을 정리하기.

static vector<vector<int>> A;
  • A를 Data영역(DATA+BSS)에 배치하여 한 번만 생성된다.
  • 특정 범위(함수, 파일, 클래스)에 한정되도록 관리한다. 
  • 변수 은닉 / 전역 네임스페이스 오염을 방지하기 위해 사용된다. 

까지가 원래 알고있던 내용이라면...
static 키워드는 컴파일러에게 해당 변수에 대해 duration과 linkage을 적용하라고 지시하는 컴파일 타임 정보이다. 
= 컴파일러와 링커가 협력해서 다른 메모리 영역에 배치하고 연결범위를 제어한다. 

1. 컴파일 단계

  • 각 소스 파일을 .o(오브젝트 파일)로 컴파일할 때:
    • 변수/함수의 **이름, 타입, 섹션 정보(.text, .data 등)**가 심볼 테이블에 등록됨.
    • 주소는 아직 없음 (실행 파일 생성 시 결정됨)
      • 심볼 테이블(Symbol Table)이란?
        • 심볼 테이블은 오브젝트 파일(.o, .out 등)에 포함된 데이터 구조
        • 변수/함수 등의 이름과 관련된 타입, 섹션, 주소, 범위 정보를 담고 있다. \
        • 컴파일러가 만들고 링커가 읽어서 심볼을 연결(resolve)할 때 사용된다.  
      • ELF 포맷 기준 (리눅스의 기본 실행/오브젝트 포맷)
        • 오브젝트 파일(.o), 실행파일, 공유 라이브러리 등은 ELF (Executable and Linkable Format) 구조로 되어 있음
        • ELF에는 다양한 섹션이 존재하고, 심볼 테이블은 .symtab 섹션에 위치
        • 이 외에도 .strtab (심볼 이름 문자열 저장), .text, .data, .bss 같은 섹션들이 존재변수/함수의 **이름, 타입, 섹션 정보(.text, .data 등)**가 심볼 테이블에 등록됨
+-------------------+
| ELF Header        |
+-------------------+
| Section Header Tbl| <-- 각 섹션(.text, .data, .symtab, .strtab...)에 대한 정보
+-------------------+
| .text             | <-- 함수 코드 (기계어)
| .data             | <-- 초기화된 전역변수
| .bss              | <-- 초기화되지 않은 전역변수
| .symtab           | <-- [심볼 테이블] 모든 변수/함수 정보
| .strtab           | <-- [문자열 테이블] 심볼 이름 저장
+-------------------+

2. 링커 단계

  • 여러 .o 파일을 합쳐 최종 실행 파일을 만들 때:
    • 심볼 테이블을 보고 어떤 심볼이 내부(파일 전용)인지, 외부 참조가 필요한지 판단
    • 외부에서 참조 가능한 심볼은 주소 충돌 방지, 연결 조정, 주소 할당 수행

그래서 static이 붙으면 컴파일러가 하는 일

  1. 해당 변수를 정적 저장 영역에 배치한다. (data/bss 섹션)
  2. 초기화 코드에 반영된다. (= 한 번만 수행)
    1. 프로그램 시작 시 1회 초기화된다. 
  3. 함수 내 변수인 경우에도 지역변수가 아닌 전역변수처럼 처리된다.
    1. 일반 지역 변수는 stack에 저장되어 함수 호출마다 push/pop으로 사용된다.
    2. 어셈블리에서는 mov로 stack에 위치를 잡게된다. 
  4. 링커가 외부 파일에서 참조 못하도록 심볼 범위를 제한한다. 
    1. 어셈블리에서는 .data/.bss 섹션에 symbol로 정의된다. 
      1. symbol table에 local symbol로 등록된다. 
        1. symbol은 컴파일러가 코드 내 변수/함수/전역상수 등에게 부여하는 고유 이름. 즉 c/c++ 코드의 변수/함수 이름 등은 컴파일 시 어셈블리/링커 수준에서 symbol로 추상화된다. 
      2. 이 변수는 외부 링크 대상에서 숨겨진다. 
    2. 컴파일러는 x가 stack이 아닌 고정된 메모리 주소에 있다고 생각하게 된다.
      1. 어셈블리에서는 스택 연산 없이 고정된 주소로 처리한다. 

 

'Algorithm' 카테고리의 다른 글

[Algorithm] c++, priority queue, min heap, ascending, 오름차순  (0) 2025.07.10
[Algorithm] DFS, BFS  (0) 2024.10.27