링커, 로더, 실행 파일

GNU 링커에서 「gcc -lmylib main.o」처럼 정적 라이브러리를 그것을 사용하는 오브젝트 파일보다 앞에 쓰면 미정의 참조 오류가 나는 경우가 있다. 그 이유로 올바른 것은?

  1. A링커는 왼쪽부터 차례로 처리하며, 라이브러리를 읽는 시점에 아직 참조되지 않은 함수는 꺼내지 않기 때문
  2. B라이브러리는 반드시 명령의 맨 끝에 하나만 쓸 수 있다는 규칙이 있기 때문
  3. C라이브러리를 앞에 쓰면 라이브러리의 내용이 지워지기 때문
정답과 해설 보기

정답: A. 링커는 왼쪽부터 차례로 처리하며, 라이브러리를 읽는 시점에 아직 참조되지 않은 함수는 꺼내지 않기 때문

GNU 링커는 명령줄에 쓰인 순서대로 파일을 처리하며, 정적 라이브러리를 만난 시점에 「아직 정의를 찾지 못한 참조」를 해결하는 오브젝트만 꺼냅니다. 라이브러리를 먼저 쓰면 그 시점에는 main.o의 참조가 아직 없으므로 아무것도 꺼내지 않고, 나중에 main.o를 읽어도 되돌아가서 찾지 않습니다. 그래서 라이브러리는 사용하는 쪽의 뒤에 쓰는 것이 원칙입니다.

  • A. 올바릅니다. 순서에 의미가 있습니다.
  • B. 라이브러리는 여러 개 쓸 수 있습니다.
  • C. 라이브러리의 내용이 지워지는 일은 없습니다.
이 분야 연습하기 분야로 돌아가기

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

  1. 위치 독립 코드(PIC)에 대한 설명으로 올바른 것은?
  2. 공유 라이브러리에서 사용되는 GOT(전역 오프셋 테이블)의 역할로 올바른 것은?
  3. 동적 링크에서 PLT(프로시저 링키지 테이블)를 사용한 지연 바인딩(레이지 바인딩)을 하는 경우의 설명으로 올바른 것은?
  4. Linux에서 동적 링크 프로그램을 시작할 때 동작하는 동적 링커(ld.so 등)의 역할로 올바른 것은?
  5. ASLR(주소 공간 배치 무작위화)의 목적으로 올바른 것은?

이 분야의 비교