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으로 취급됨. - 중복된 약한 심볼은 아무거나 선택함
- Strong 심볼 중복 안됨
728x90
반응형
'CS > 컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조](23)[프로세스] (0) | 2025.02.28 |
---|---|
[컴퓨터 구조](22)[제어흐름변경] (0) | 2025.02.27 |
[컴퓨터 구조](20)[링킹] (0) | 2025.02.14 |
[컴퓨터 구조](19)[캐시 구조 & 원리] (0) | 2025.02.13 |
[컴퓨터 구조](18)[공간 지역성과 캐시] (0) | 2025.02.12 |