목적파일
ABI : (Application binary interface ) 와 중요성에 대해 설명
목적 파일 형식 : 현존하는 목적 파일 형식과 쓸모 없어진 목적 파일 형식에 대해서 설명.
ELF에 대해서 소개
재배치 가능한 목적 파일 : 첫번째 결과물에 대해서 다룸.
실행 가능한 목적 파일 실행가능한 목적파일에 대해 설명
정적 라이브러리 : 정적 라이브러리의 내용과 만드는 법에 대해 이야기
동적 라이브러리 : 공유 목적 파일에 대해 이야기
ABI
API 는 일반적으로 프로그램간 기능 제공에 해당하는 규칙을 말하는데
ABI 는 프로그램간 기계어 의 호환 규칙을 말하는것으로 볼 수 있다.
말이 어려운데 쉽게 이야기 하면 결국 내부적으로 api나 abi 둘다 프로그램간의
협약 규칙을 말하나 이것이 프로그램 간 인지, 시스템상의 호출 규약인지를 다루는 차이
라고 보면 편한 내용 인듯 하다 .
abi 는 크게 명령어 집합, 자료형과 정렬규칙, 호출 규칙, 호출방식의 정의, 사용된 목적파일 형식
네임맹글링, 가상테이블 레이아웃 등과 같은 내용들을 일반적으로 담는다.
우리가 사용하는 유닉스 계열의 로직에서는 System v ABI 를 표준으로 사용하고 이때 ELF(executable linking format)
는 표준 목적 파일의 형식을 나타낸다.
목적 파일의 형식
현재의 목적파일의 형식은 a.out 목적 파일 형식을 계승하는 시스템으로 동작한다.
현재에는 a.out 대신 COFF 라는 형식으로 대체되었고 이것이 현 ELF 의 기반로직이 되었다.
재배치 가능한 목적파일
앞장에서 살펴본 내용과 같고 이는 컴파일 파이프라인에서 어셈블리 파이프 라인에서의 결과물이고
최종 결과물에서 사용되는 결과물이라고 할 수 있다 .
여기서 재배치 가능한 이야기라는것은 이 파일들이 변경되어 다른 목적파일로 동작 할 수 있다는 것이기도 한데
말이 좀 이상하기에 예시를 들어서 설명하겠음.
파일 b.c라는 녀석의 내용 안에
int strlen(char *str)
{
int i;
while (str[i])
++i;
return (i);
}
이 있었고 여기서 내부적인 결함을 찾아 다음과 같이 변경하였음.
int strlen(char *str)
{
char *tmp = str;
while (*str)
++str;
return (str - tmp);
}
이때 b 의 오브젝트 파일을 만들어서 전체 프로그램을 수행 할 수 있음.
실행 가능한 목적 파일
여러 재배치 가능한 목적파일들을
하나로 링킹하고 이를 통해 유사한 섹션을 큰 섹션으로 포함하고
내부적으로 유지 하여 이를 통해 하나의 큰 로직으로 만들어주는 과정이라고 볼 수 있음
이때 주소는 값을 가지게 되나 공유 목적에서는 상대 주소값을 절대적으로 가지고 있는것을
말함.
정적 라이브러리
ar 과 같은 유틸리티를 통해서 아카이브화를 하고 이때
재배치 가능한 목적 파일에서 라이브러리를 추출하며, 이때 정의 되지 않은 심벌들을 찾아서 처리하는 방식으로
동작한다. 이때 .a 확장자를 가지고 윈도우에서는 .lib 확장자를 가지게 된다 .
결국정적 라이브러리는 실행 파일을 가지고 있는것이라고 볼 수 있음.
동적 라이브러리
이때 위의 정적 라이브러리와 가장 큰 차이는 실제 프로세스에 로드 될 때 라이브러리를 불러와서
처리하는 방식으로 처리되고 이에 정의되지 않은 모든 심벌들을 찾아서 해결 했을 경우에
동작이 진행 되는 방식이 있다. 따라서 링크에서 처리되지 않고 실제 실행에서 처리되는 로직들이
발생하는 과정이 추가된다고 볼 수 있다. 이때는 동적 링커라는 녀석이 링크를 담당하게 된다.