링커, 로더, 실행 파일

C++에서 전역 오브젝트의 생성자가 main보다 먼저 실행되는 구조로 올바른 것은?

  1. ACPU가 생성자를 찾아 자동으로 먼저 실행한다
  2. Bmain 함수의 첫 줄에 컴파일러가 반드시 모든 생성자를 옮겨 적는다
  3. C생성자를 호출하는 함수의 주소가 .init_array 등의 표에 모여 있고, 시작 코드가 main 전에 차례로 호출한다
정답과 해설 보기

정답: C. 생성자를 호출하는 함수의 주소가 .init_array 등의 표에 모여 있고, 시작 코드가 main 전에 차례로 호출한다

컴파일러는 각 파일의 전역 오브젝트를 초기화하는 함수를 만들고 그 주소를 .init_array라는 특별한 섹션에 넣습니다. 링커는 모든 파일의 .init_array를 하나의 표로 모으고, 시작 코드나 동적 링커가 main 전에 이 표의 함수를 차례로 호출합니다. 반대로 종료 시 처리는 .fini_array에 모입니다. 파일을 넘나드는 초기화 순서는 정해져 있지 않으므로 서로 의존하지 않도록 주의해야 합니다.

  • A. CPU는 생성자라는 개념을 모릅니다.
  • B. 다른 파일의 오브젝트는 main이 있는 파일에서는 알 수 없습니다.
  • C. 올바릅니다. 링커가 각 파일의 표를 하나로 모읍니다.
이 분야 연습하기 분야로 돌아가기

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

  1. 컴파일러가 하나의 소스 파일에서 출력하는 오브젝트 파일(.o)에 대한 설명으로 올바른 것은?
  2. 링커의 주된 역할로 올바른 것은?
  3. 링커가 수행하는 심볼 해석에 대한 설명으로 올바른 것은?
  4. 링커가 수행하는 재배치(리로케이션)에 대한 설명으로 올바른 것은?
  5. C 언어 프로그램을 링크했더니 「undefined reference to `foo'」(foo에 대한 미정의 참조)라는 오류가 나왔다. 가장 가능성이 높은 원인은?

이 분야의 비교