CS/컴퓨터 구조

[컴퓨터 구조](21)[ELF와 링커심볼]

황올뱀 2025. 2. 17. 18:58

ELF: 실행가능하고 링크 가능한 포맷 (목적파일의 표준 바이너리 포맷)

  • 예) a.out(UNIX), PE(Windows) (리버싱 입문 정리 2 참고), Mach-O(Mac OS)
  • 종류
    • 재배치 가능 목적 파일(.o): 다른 목적파일과 결합될 수 있는 코드, 데이터 포함하는 파일, 하나의 목적파일은 하나의 소스코드에서 생성
    • 실행 가능 목적 파일(.out): 실행될 수 있는 형태의 파일 (링킹이 완료된 상태)
    • 공유 목적 파일(.so): 다른 프로그램과 공유될 수 있는 라이브러리 (windows의 DLL)
  • 구성
    • ELF 헤더: 워드 크기, 바이트 순서, 파일 타입, 머신 타입 등 정의
    • 세그먼트 헤더 테이블: 페이지 크기, 가상주소메모리 세그먼트, 세그먼트 크기 정의
    • .text: 컴파일된 프로그램의 기계어 코드
    • .rodata: 읽기 전용 데이터
    • .data: 초기화된 전역변수, 정적 변수(지역변수)
    • .bss: 초기화되지않은 전역변수 및 정적 변수(상)
    • .symtab: 심볼 테이블 (프로시저&정적변수 이름, 섹션 이름과 위치 저장됨)
    • .rel.txt: .text를 위한 재배치 정보 저장
    • .rel.data: .data를 위한 재배치 정보 저장
    • .debug: 디버깅 심볼을 위한 정보 저장
    • 섹션 헤더 테이블: 각 섹션의 오프셋 및 크기

링커 심볼의 종류

  • 전역 심볼: 모듈 내부에서 정의되었고, 다른 모듈에 의해 참조될 수 있는 심볼
  • 모듈에 의해 참조되지만 다른 모듈에 의해 정의된 전역 심볼
  • 지역 심볼: 모듈 내부에서 정의되었고 다른 모듈에 의해 참조될 수 없는 심볼 (배타적)
    중복 심볼 정의의 처리
    여러 소스코드로 프로그램을 짜다 보면 심볼이 겹치는 상황 발생할 수도 있음 -> 링커가 처리
  • 심볼 구분
    • Strong: 프로시저, 초기화된 전역 심볼
    • Weak: 초기화 안된 전역 심볼
      지역변수는 함수 내부에서만 사용되며 스택에 할당되므로 심볼테이블에 저장안해서 상관 없음. 지역변수와 전역변수가 중복된다면 지역변수 우선
  • 중복 심볼 정의 처리
    • Strong 심볼 중복 안됨
      예) 파일A에서 int x = 10;이라 정의했는데 파일B에서 int x = 9; 이러면 링커오류 뜸
    • Strong 심볼과 Weak 심볼이 중복이라면 Strong 심볼 선택
      예) 파일A에서 int x = 10;이라 정의하고 B파일에서 int x;라 정의한다면 B에서도 자동으로 x는 10으로 취급됨.
    • 중복된 약한 심볼은 아무거나 선택함
728x90
반응형