두 번째 읽기 전용 프로그램별 메모리 세그먼트에는 어떤 데이터가 저장됩니까?

두 번째 읽기 전용 프로그램별 메모리 세그먼트에는 어떤 데이터가 저장됩니까?

저는 메모리 관리에 대해 배우고 있으며 내 프로그램과 관련된 두 번째 읽기 전용 메모리 세그먼트에 무엇이 저장되어 있는지 확인하려고 합니다.

00400000-00401000 r-xp 00000000 00:28 144 /a.out
00600000-00601000 r--p 00000000 00:28 144 /a.out
00601000-00602000 rw-p 00001000 00:28 144 /a.out

제 생각에는 하위 범위 세그먼트를 실행 코드와 상수 전역 변수가 저장되는 코드 세그먼트(또는 텍스트 세그먼트)로 식별한 것 같습니다. 또한 읽기/쓰기 액세스 권한이 있는 세 번째 세그먼트는 전역 및 정적 변수를 저장하는 데이터 세그먼트라고 생각했습니다.

내 연구에 따르면 초기화되지 않은 변수가 저장되는 BSS라는 세그먼트가 있습니다. 그러나 주소 00600000-00601000 사이의 두 번째 메모리 세그먼트는 읽기 전용으로 표시되며 거기에는 초기화되지 않은 변수가 있어야 합니다(초기화하는 방법).

내 이론은 여기에 전역 상수 변수를 저장한다는 것입니다. 그러나 연구와 실험에 따르면 텍스트 세그먼트에 저장되므로 그렇지 않은 것으로 나타났습니다.

또한 읽기 전용 데이터 세그먼트(rodata)에 대해서도 읽었습니다. 내가 이해한 바에 따르면 이 세그먼트에는 정적 상수 데이터가 포함되어 있는 것으로 보입니다. 이것이 바로 이것입니까? 상수 전역 변수가 여기에 저장되는 이유는 무엇입니까?

나는 테스트 프로그램을 컴파일하기 위해 gcc를 사용하고 있습니다.

답변1

r--p읽기 전용이며 실행할 수 없는 세그먼트를 나타냅니다. 일반적인 ELF 실행 파일의 경우 일부 링커 정보가 포함되어 있습니다. 실행하거나 objdump -D a.outreadelf -a a.out단락의 내용을 볼 수 있습니다. 예를 들어 readelf -a /bin/sleepDebian Linux의 x86_64에서는 세그먼트에 다음 부분이 나타납니다.

  [18] .init_array       INIT_ARRAY       0000000000606e10  00006e10
       0000000000000008  0000000000000000  WA       0     0     8
  [19] .fini_array       FINI_ARRAY       0000000000606e18  00006e18
       0000000000000008  0000000000000000  WA       0     0     8
  [20] .jcr              PROGBITS         0000000000606e20  00006e20
       0000000000000008  0000000000000000  WA       0     0     8
  [21] .dynamic          DYNAMIC          0000000000606e28  00006e28
       00000000000001d0  0000000000000010  WA       6     0     8
  [22] .got              PROGBITS         0000000000606ff8  00006ff8
       0000000000000008  0000000000000008  WA       0     0     8

이것최하위 비트이 부분을 기록해 보세요.

관련 정보