링커, 로더, 실행 파일

a.c와 b.c 양쪽에서 static을 붙이지 않은 같은 이름의 전역 함수 void init(void)를 정의하고 링크했다. 일어나는 일로 올바른 것은?

  1. A나중에 링크한 쪽이 자동으로 사용되며 오류는 나지 않는다
  2. B같은 심볼이 두 번 정의되었다며 링크할 때 오류가 난다
  3. C두 함수가 자동으로 하나로 합쳐져 두 처리가 차례로 실행된다
정답과 해설 보기

정답: B. 같은 심볼이 두 번 정의되었다며 링크할 때 오류가 난다

static을 붙이지 않은 전역 함수는 프로그램 전체에서 하나의 이름을 공유합니다. 같은 이름의 정의가 둘이면 링커는 참조를 어느 쪽에 연결해야 할지 정할 수 없으므로 다중 정의(multiple definition) 오류가 됩니다. 파일 안에서만 쓰는 함수라면 static을 붙여 외부에서 보이지 않게 하면, 다른 파일에 같은 이름이 있어도 충돌하지 않습니다.

  • A. 일반적인(강한) 심볼에서는 어느 한쪽을 선택하지 않습니다.
  • B. 올바릅니다. 다중 정의 오류입니다.
  • C. 함수가 합쳐지는 일은 없습니다.
이 분야 연습하기 분야로 돌아가기

링커, 로더, 실행 파일의 다른 문제

  1. C 언어에서 함수에 static을 붙여 정의했을 때(예: static int helper(void))의 효과로 올바른 것은?
  2. C 언어에서 「extern int count;」라고 썼을 때의 의미로 올바른 것은?
  3. Linux 등에서 많이 쓰이는 ELF 형식의 파일에 대한 설명으로 올바른 것은?
  4. 실행 파일의 .text 섹션에 들어 있는 것은?
  5. C 언어에서 파일 바깥에 「int limit = 100;」이라고 쓴 전역 변수는 일반적으로 어느 섹션에 놓이는가?

이 분야의 비교