Computer Science

    [CSAPP] 7.8 Executable Object Files(실행 가능한 객체 파일)

    7.8 Executable Object Files(실행 가능한 객체 파일) 우리는 linker가 여러개의 object file들을 하나의 executable object file로 합치는 것을 보았다. 예제인 C 프로그램은 ASCII text file에서 시작해서 프로그램이 메모리에 load되고 실행되기 위해 필요한 모든 정보를 가지고 있는 binary file로 바뀌었다. 아래 그림은 ELF executable file에 그런 정보들을 요약한 것이다. executable object file의 format은 relocatable object file과 비슷하다. ELF header가 파일의 전체적인 format을 설명한다. 이것은 프로그램의 entry point도 포함한다. entry point는 프로..

    [CSAPP] 7.7 Relocation(재배치)

    7.7 Relocation(재배치) linker가 symbol resolution 단계를 끝내면 코드의 각 symbol reference를 하나의 symbol definition = input object modules 중 하나의 symbol table entry와 연결한다. 이 때 linker는 input object modules의 code, data section의 정확한 size를 알고 있다. 이제 input module을 합치고 각 symbol에 run time 주소를 할당하는 relocation 단계를 할 준비가 다 된 것이다. relocation은 다음 2단계로 진행이 된다. Relocating sections and symbol definitions (함수, 변수 선언 된 것) 이 단계에서..

    [CSAPP] 7.6 Symbol Resolutions(심볼 해석)

    학습 주제 정리한 내용 심볼 해석은 링커가 입력으로 들어오는 재배치 가능 오브젝트 파일들의 심볼 테이블 정보를 바탕으로 각각의 심볼 참조를 정확하게 하나의 심볼 정의에 연결시키는 작업을 뜻한다. 심볼 정의란 곧 해당 심볼을 정의하는 심볼 테이블 엔트리를 의미하며, 심볼 참조란 코드 상에서 해당 심볼을 참조하는 부분을 의미한다. 링커는 자신의 입력 재배치 가능 목적파일들의 심볼 테이블로부터 정확히 한 개의 심볼 정의에 각 참조를 연결시켜 심볼 참조를 해석한다. 지역 심볼의 경우 컴파일러는 모듈당 단 하나의 지역 심볼 정의만을 허용한다. 지역 링커 심볼들을 갖게 되는 정적 지역 변수들이 유일한 이름을 갖도록 보장 전역 심볼의 경우, 컴파일러가 현재 모듈에 정의되지 않은 심볼을 만나면, 이 심볼이 다른 모듈에..

    [CSAPP] 7.12 Position-Independent Code (PIC)(위치 독립성 코드)

    7.12 Position-Independent Code (PIC)(위치 독립성 코드) 공유 라이브러리의 주요 목적은 실행 중인 여러 프로세스가 메모리에서 동일한 라이브러리 코드를 공유하여 귀중한 메모리 공간을 절약할 수 있도록 하는 것이다. 그렇다면 어떻게 여러 프로세스가 프로그램의 단일 복사본을 공유할 수 있을까? 한 가지 접근 방법은 사전에 각 공유 라이브러리에 대한 주소 공간의 특정 chunk를 할당한 다음에 loader가 항상 해당 주소에서 라이브러리를 load하도록 요구하는 것이다. 간단하지만 이 접근 방식은 몇 가지 심각한 문제를 야기한다. 프로세스가 라이브러리를 사용하지 않더라도 공간의 일부가 할당되기 때문에 주소 공간을 비효율적으로 활용한다. 주소 공간을 관리하기도 어렵게 된다. 라이브러리..

    [CSAPP] 7.11 Loading and Linking Shared Libraries from Applications (응용 프로그램으로부터 공유 라이브러리를 로드하고 링크하기)

    7.11 Loading and Linking Shared Libraries from Applications (응용 프로그램으로부터 공유 라이브러리를 로드하고 링크하기) 지금까지는 응용 프로그램이 로드될 때 , 실행 직전에 dynamic linker가 공유 라이브러리를 load하고 link하는 과정에 대해 설명했다. 그러나 compile-time에 해당 라이브러리에 대해 응용 프로그램을 링크할 필요 없이. 응용 프로그램이 실행되는 동안 Dynamic linker에 임의 공유 라이브러리를 load하고 link하도록 요청할 수 있다. 이에 대한 세 가지 예시는 아래와 같다. 소프트웨어 배포(distributing software): MS 응용 프로그램 개발자는 공유 라이브러리를 자주 사용하여 소프트웨어 업데이..