ch7-Linking

이란, 여러 코드 조각들을 모아서 하나의 단일 파일로 만드는 것이다.

  • , 소스코드가 machine code 로 변환될 때,
  • , 메모리로 이동되고, 에 의해 실행될 때,
  • , 프로그램이 실행될 때
    이루어진다.

과거에는 수동으로 이루어졌지만, 현대에서는 에 의해 자동으로 이루어진다.
을 가능하게 해준다.
이는 하나의 크고 긴 소스코드를 한번에 컴파일 하는 것이 아닌,
더 작고 다루기 쉬운 모듈() 로 다룰 수 있게 해준다.

어떤 부분에서의 수정은 해당 모듈에 대한 수정, 즉 재컴파일만 이루어지면 된다.

에 의해 자동적으로 수행되어지지만, 아래의 이유로 배워야한다.


  • 의 작동원리를 아는 것은 라이브러리, 모듈의 연결 과정에서의 에러를 해결하는데 도움을 줄 수 있다.


  • linking 과정에서 프로그램의 정당성(correctness) 에 영향을 줄 수 있다.
    잘못 정의된 여러 전역변수는 linker 가 어떠한 에러도 보여주지 않는다.
    이것이 어떻게 발생하는지, 어떻게 해결하는지 살펴본다.


  • 전역변수와 지역변수의 차이, static 으로 정의한 것의 의미가 무엇인지 등을 살펴본다.


  • linker 에 의해 만들어진 목적파일(object file)은 시스템 함수에서 중요한 역할을 한다.
    프로그램 로딩, 실행, 가상 메모리 등등이 있다.


  • 과거에는 직관적인 일이었지만,
    shared libraries, dynamic linking 의 중요성이 부각되면서, 그 과정은 좀 더 정교해졌다.
    이에 따라 linking 은 유용한 도구가 되었다.
    예를 들어, 을 업데이트하는데에는, shared libraries 가 사용된다.
    란, 중간 바이너리 파일로서, 시스템 종속성이 제거되어있어,
    여러 시스템에서 같은 파일로 사용할 수 있다는 장점이 있다. 각 시스템에서 linking 을 통해 시스템용 실행 파일로 변환된다.
    dynamic linking 을 이용한다.

이 챕터에서는 모든 linking 의 양상을 살펴본다.
여기서는 특정 환경에 종속적으로 확인하지만, 주요한 컨셉은 다른 시스템에서도 동일하다.

아래는 해당 챕터에서 계속 살펴볼 2개의 소스코드이다.

	int sum(int *a, int n);
	int array[2] = {1, 2};

	int main() {
		int val = sum(array, 2);
		return val;
	}
	int sum(int *a, int n) {
		int i, s = 0;
		for(i = 0; i < n; i++) {
			s += a[i];
		}
		return s;
	}