저는 메모리 관리에 대해 배우고 있으며 내 프로그램과 관련된 두 번째 읽기 전용 메모리 세그먼트에 무엇이 저장되어 있는지 확인하려고 합니다.
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.out
이 readelf -a a.out
단락의 내용을 볼 수 있습니다. 예를 들어 readelf -a /bin/sleep
Debian 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
이것최하위 비트이 부분을 기록해 보세요.