c

목적파일

mallang_col 2022. 11. 24. 17:30

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 확장자를 가지게 된다 .

결국정적 라이브러리는 실행 파일을 가지고 있는것이라고 볼 수 있음.

 

동적 라이브러리

 

이때 위의 정적 라이브러리와 가장 큰 차이는 실제 프로세스에 로드 될 때 라이브러리를 불러와서 

처리하는 방식으로 처리되고 이에 정의되지 않은 모든 심벌들을 찾아서 해결 했을 경우에 

동작이 진행 되는 방식이 있다. 따라서 링크에서 처리되지 않고 실제 실행에서 처리되는 로직들이 

발생하는 과정이 추가된다고 볼 수 있다. 이때는 동적 링커라는 녀석이 링크를 담당하게 된다.