링커, 로더, 실행 파일
오브젝트 파일을 역어셈블했더니 외부 함수 printf를 호출하는 명령의 분기 대상이 0 같은 임시 값으로 되어 있었다. 이 값은 언제 올바르게 채워지는가?
- A컴파일러의 오류이므로 소스 코드를 고치지 않으면 채워지지 않는다
- BCPU가 명령을 실행하는 순간에 분기 대상을 추측해서 정한다
- C링크할 때(동적 링크라면 일부는 실행 시), 재배치 정보에 따라 채워진다
정답과 해설 보기
정답: C. 링크할 때(동적 링크라면 일부는 실행 시), 재배치 정보에 따라 채워진다
컴파일 시점에는 printf의 주소를 알 수 없으므로 컴파일러는 분기 대상을 임시 값으로 두고, 「이 명령의 이 칸에 printf의 주소를 넣는다」라는 재배치 정보를 남깁니다. 링커는 그것을 보고 올바른 값을 써 넣습니다. 동적 링크라면 PLT의 입구를 가리키도록 고쳐 쓰고, 실제 라이브러리 함수의 주소는 실행 시에 동적 링커가 GOT에 넣습니다.
- A. 오류가 아니라 재배치를 전제로 한 정상적인 상태입니다.
- B. CPU가 분기 대상을 추측해서 정하는 일은 없습니다.
- C. 올바릅니다. 임시 값은 정상적인 상태입니다.