링커, 로더, 실행 파일

C 언어의 「char *p = "hello"; p[0] = 'H';」를 실행하면 많은 환경에서 비정상 종료된다. 그 이유로 올바른 것은?

  1. A문자열이 스택에 놓여 있었는데 함수에서 돌아와 사라졌기 때문
  2. B문자열 리터럴은 쓰기가 금지된 .rodata에 놓이는데, 거기에 쓰려고 했기 때문
  3. Cp가 0으로 초기화되어 있었기 때문
정답과 해설 보기

정답: B. 문자열 리터럴은 쓰기가 금지된 .rodata에 놓이는데, 거기에 쓰려고 했기 때문

"hello" 같은 문자열 리터럴이나 const를 붙인 전역 상수는 읽기 전용 데이터 영역(.rodata)에 놓입니다. 이 페이지는 쓰기가 금지되어 있으므로 쓰려고 하면 CPU가 보호 위반을 검출하고 OS가 프로그램을 중단시킵니다(세그멘테이션 오류). 고쳐 쓰고 싶다면 「char s[] = "hello";」처럼 배열로 만들면 쓰기 가능한 영역에 사본이 만들어집니다.

  • A. 문자열 리터럴은 프로그램 실행 중 계속 남아 있습니다.
  • B. 올바릅니다. 쓰기에서 보호 위반이 됩니다.
  • C. p는 문자열의 시작을 가리키고 있습니다.
이 분야 연습하기 분야로 돌아가기

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

  1. 위의 전역 변수 중 일반적으로 .bss 섹션에 놓이는 것의 조합은?
  2. C 언어의 함수 안에서 선언한, static이 붙지 않은 지역 변수(자동 변수)는 실행 중 어디에 놓이는가?
  3. C 언어의 malloc으로 확보한 메모리는 일반적으로 프로세스의 어느 영역에서 가져오는가?
  4. Linux 등의 일반적인 프로세스의 메모리 배치를 주소가 작은 쪽부터 나열한 것으로 올바른 것은?
  5. 프로세스의 힙과 스택을 사이에 넓은 빈 공간을 두고 서로 반대 방향으로 늘어나도록 배치할 때의 이점으로 올바른 것은?

이 분야의 비교