링커, 로더, 실행 파일

오브젝트 파일을 역어셈블했더니 외부 함수 printf를 호출하는 명령의 분기 대상이 0 같은 임시 값으로 되어 있었다. 이 값은 언제 올바르게 채워지는가?

  1. A컴파일러의 오류이므로 소스 코드를 고치지 않으면 채워지지 않는다
  2. BCPU가 명령을 실행하는 순간에 분기 대상을 추측해서 정한다
  3. C링크할 때(동적 링크라면 일부는 실행 시), 재배치 정보에 따라 채워진다
정답과 해설 보기

정답: C. 링크할 때(동적 링크라면 일부는 실행 시), 재배치 정보에 따라 채워진다

컴파일 시점에는 printf의 주소를 알 수 없으므로 컴파일러는 분기 대상을 임시 값으로 두고, 「이 명령의 이 칸에 printf의 주소를 넣는다」라는 재배치 정보를 남깁니다. 링커는 그것을 보고 올바른 값을 써 넣습니다. 동적 링크라면 PLT의 입구를 가리키도록 고쳐 쓰고, 실제 라이브러리 함수의 주소는 실행 시에 동적 링커가 GOT에 넣습니다.

  • A. 오류가 아니라 재배치를 전제로 한 정상적인 상태입니다.
  • B. CPU가 분기 대상을 추측해서 정하는 일은 없습니다.
  • C. 올바릅니다. 임시 값은 정상적인 상태입니다.
이 분야 연습하기 분야로 돌아가기

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

  1. 임베디드 개발에서 사용하는 링커 스크립트의 역할로 올바른 것은?
  2. OS가 없는 마이컴에서 전원을 켠 직후, 시작 코드가 main을 호출하기 전에 수행하는 처리로 올바른 것은?
  3. ELF 파일에서 「섹션」과 「세그먼트」의 차이로 올바른 것은?
  4. 메모리 페이지에 「쓰기 가능」과 「실행 가능」을 동시에 허용하지 않는(W^X, 쓰기와 실행의 분리) 것으로 막기 쉬워지는 공격은?
  5. Linux 공유 라이브러리에서 libfoo.so.1의 「.1」과 같은 soname의 버전 번호를 올리는 것은 일반적으로 어떤 경우인가?

이 분야의 비교