링커, 로더, 실행 파일

C++ 컴파일러가 함수 이름에 인수 타입 등의 정보를 덧붙여 심볼 이름을 만드는 「이름 장식(맹글링)」의 주된 목적은?

  1. A함수 이름을 읽을 수 없게 해서 프로그램을 도용당하지 않게 하기 위해
  2. B함수 이름을 짧게 해서 실행 파일을 작게 하기 위해
  3. C같은 이름이지만 인수 타입이 다른 함수(오버로드)나 네임스페이스를 링커가 구별할 수 있게 하기 위해
정답과 해설 보기

정답: C. 같은 이름이지만 인수 타입이 다른 함수(오버로드)나 네임스페이스를 링커가 구별할 수 있게 하기 위해

링커는 심볼을 이름 문자열만으로 대조합니다. C++에서는 「print(int)」와 「print(double)」처럼 같은 이름의 함수를 만들 수 있으므로 그대로는 구별할 수 없습니다. 그래서 컴파일러는 「_Z5printi」처럼 인수 타입 등을 이름에 집어넣습니다. C 언어의 함수는 장식되지 않으므로, C++에서 C 함수를 호출할 때는 「extern "C"」를 붙여 장식을 하지 않게 합니다.

  • A. 보호를 위한 것이 아닙니다.
  • B. 오히려 이름은 길어집니다.
  • C. 올바릅니다. 링커는 이름만으로 대조하기 때문입니다.
이 분야 연습하기 분야로 돌아가기

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

  1. Linux의 dlopen 함수(Windows의 LoadLibrary에 해당)의 용도로 가장 적절한 것은?
  2. 100개의 프로세스가 같은 공유 라이브러리를 사용하고 있을 때, 물리 메모리 사용 방식으로 올바른 것은?
  3. 오브젝트 파일을 역어셈블했더니 외부 함수 printf를 호출하는 명령의 분기 대상이 0 같은 임시 값으로 되어 있었다. 이 값은 언제 올바르게 채워지는가?
  4. 임베디드 개발에서 사용하는 링커 스크립트의 역할로 올바른 것은?
  5. OS가 없는 마이컴에서 전원을 켠 직후, 시작 코드가 main을 호출하기 전에 수행하는 처리로 올바른 것은?

이 분야의 비교