ABI / API
ABI (Application Binary Interface)
- 바이너리 레벨의 규약
- 함수 호출 시 스택 또는 레지스터 사용법
- 심볼 이름 mangling 규약 등..
- OS / 프로세서 별로 규정
- 바이너리 수준의 호환성
API (Application Programming Interface)
- OS나 라이브러리 등을 이용하기 위한 함수, 데이터 구조 규약
- 코드 레벨 수준의 호환성
세그먼트
.bss (Block Started by Symbol Segment)
.data: 초기화된 데이터가 위치하는 세그먼트
.text: 기계어 코드가 위치하는 세그먼트
공유 라이브러리
DSO (Dynamic Shared Object)
- 리눅스에서 동적 링크하는 공유 라이브러리
.so 확장자
코드 포지션 정보
PIC (Position Independent Code)
- 임의의 주소에 로드 가능한 코드
- 데이터 엑세스나 jump 등은 상대 주소로 수행
GOT (Global Offset Table)
- PIC 를 실현하기 위한 데이터
- PIC 에서는 전역 데이터로의 접근을 GOT 를 이용하여 간접적으로 참조
PLT (Procedure Linkage Table)
- 동적 링크를 위해 필요한 데이터
- GOT 와 함께 사용해서 동적 링크 가능한 공유 라이브러리 함수를 간접적으로 호출 할 수 있음
PIE (Position Independent Executable)
공유 라이브러리에 대하여
- 공유라이브러리는 임의의 메모리 주소에도 로딩 될 수 있도록 만들어지는데, 프로그램 코드는 반드시 PIC(위치 독립적인 코드) 로 만들어져야 한다.
- PIC 코드는 심볼의 참조가 특정 레지스터에 상대적이도록 만들어지는 코드다.
- 공유 라이브러리는 이와 함께 심볼을 재배치 하기 위해 GOT 를 사용한다.
- GOT 에는 프로그램에서 참조하는 라이브러리 내의 모든 정적(static) 심볼들에 대한 포인터를 담고 있다.
- 이 테이블은 동적 링커인 ld.so 에 의해 재배치 되어 실제 주소가 채워지게 됨.