링크란?
대략적인 과정은 링커가 모든 오브젝트 코드들을 입력받아서 최종실행파일을 출력하는 과정이다.
- 입력 : 모든 오브젝트 코드들
- 링커는 오브젝트 코드에 있는 구멍들을 메꿔줘야 하므로 모든 오브젝트 코드들을 입력받는다
- 처리
- 오브젝트 파일을 다 모아서 하나의 이진파일로 만들면서 함수들의 위치도 기억하고 있는다
- 그러다 함수 호출 코드를 만나면 실행위치(구멍)에 함수 주소로 점프하는 코드를 넣어준다
- 출력 : 최종실행파일(.exe, .out)
파일에서 선언만 되어있고 구현(정의)이 되지 않아서 여전히 구멍으로 남으면 어떡하나요?
이럴 때는 링커가 링커오류를 출력한다. 이는 경고(Warning)가 아니라 애러(Error)이기 때문에 실행파일이 만들어지지 않는다.
왜 컴파일단계와 링크 단계가 분리되어 있는 이유
.c 파일에 구멍이 많으면 이 구멍들을 메꾸는데 시간이 엄청 오래 걸린다.
그렇다고 이 구멍들을 그냥 직접 함수를 집어넣어서 메꾼다고 생각해 보자 이렇게 된다면 많은 .c 파일들을 나중에 빌드할 때, 함수들끼리 중복이 발생하여 이 중복문제를 해결하기가 복잡해진다
그러면 .c 파일을 다 합쳐서 빌드하면 중복문제도 해결하고 구멍들도 없어지고 좋지 않냐라고 생각할 수 있는데, 이때의 문제는 .c 파일의 코드 한 줄을 수정하고 다시 빌드하게 되면 시간 엄청 오래 걸리게 된다.
그렇기 때문에 컴파일 단계와 링크 단계가 분리되어 있다.
결론
.c 파일을 하나씩 따로 컴파일해서 오브젝트 파일로 저장하면 컴파일 시간도 줄어들고 나중에 바뀐 .c 파일만 컴파일해서 오브젝트 파일을 만들어서 기존 오브젝트들을 링크하는 것이 시간적인 측면에서 매우 효율적이어서 컴파일 단계와 링크단계가 분리되었다.
오브젝트 파일로 실행파일은 어떻게 만들지? (Clang 기준)
업계에서는 큰 의미의 컴파일을 한 다음에 오브젝트 파일들로 링크를 하는 것이 흔하게 사용된다고 한다.
그렇다면 clang에서 오브젝트 파일은 어떻게 만들까?
clang -std=c89 -W -Wall -pedantic-errors main.o do_something.o
clang -std=c89 -W -Wall -pedantic-errors *.o
오브젝트 파일을 선택하고 싶으면 첫 번째 방식대로 하면 되고 오브젝트 파일 전부 다 링크하고 싶으면 아래와 같은 방식을 사용하면 된다.
출처 : POCU Academy COMP2200
'C언어 > C언어' 카테고리의 다른 글
[C언어]스택(Stack) 메모리 (0) | 2023.02.17 |
---|---|
[C언어]함수 매개변수에 함수를 넣으면 순서대로 작동할까?(함수 매개변수의 평가순서) (0) | 2023.02.17 |
[C언어][Hex]헥스편집기 HxD editor 다운로드 방법 (0) | 2023.02.16 |
[C언어]어셈블(Assemble) 단계 (0) | 2023.02.16 |
[C언어]컴파일(Compilation) 단계 (2) | 2023.02.16 |
댓글