링커, 로더, 실행 파일
C++에서 전역 오브젝트의 생성자가 main보다 먼저 실행되는 구조로 올바른 것은?
- ACPU가 생성자를 찾아 자동으로 먼저 실행한다
- Bmain 함수의 첫 줄에 컴파일러가 반드시 모든 생성자를 옮겨 적는다
- C생성자를 호출하는 함수의 주소가 .init_array 등의 표에 모여 있고, 시작 코드가 main 전에 차례로 호출한다
정답과 해설 보기
정답: C. 생성자를 호출하는 함수의 주소가 .init_array 등의 표에 모여 있고, 시작 코드가 main 전에 차례로 호출한다
컴파일러는 각 파일의 전역 오브젝트를 초기화하는 함수를 만들고 그 주소를 .init_array라는 특별한 섹션에 넣습니다. 링커는 모든 파일의 .init_array를 하나의 표로 모으고, 시작 코드나 동적 링커가 main 전에 이 표의 함수를 차례로 호출합니다. 반대로 종료 시 처리는 .fini_array에 모입니다. 파일을 넘나드는 초기화 순서는 정해져 있지 않으므로 서로 의존하지 않도록 주의해야 합니다.
- A. CPU는 생성자라는 개념을 모릅니다.
- B. 다른 파일의 오브젝트는 main이 있는 파일에서는 알 수 없습니다.
- C. 올바릅니다. 링커가 각 파일의 표를 하나로 모읍니다.