BSS / 데이터 / rodata 세그먼트 모두 전역변수/상수가 저장되는 위치이다.
일단 이거는 머리에 넣어두고
다만 어떤 전역변수/상수가 저장되느냐 인데, 이 글을 통해 살펴보자.
각 세그먼트마다 머리에 넣어두면 좋을 내용을 먼저 정리해보면
BSS 세그먼트 : 프로그램 시작시 모두 0으로 초기화됨 => 선언하고 초기화 하지않은 전역변수
데이터 세그먼트 : 프로그램 시작시 0으로 초기화 안됨 => 초기화된 전역변수/전역상수가 위치하는 영역.
rodata 세그먼트 : 데이터 세그먼트 안에 수정 불가능한 영역 => 값이 변하면 안되는 데이터가 위치함. (문자열 / 전역상수)
자 조금만 생각해보자.
전역변수를 선언하고 초기화를 하지 않았으면 프로그램을 실행하는 도중에 변수에 값을 넣어주는 과정이 필연적으로 있을 것이다. => 그래서 BSS영역에 읽기권한 뿐만아니라 쓰기권한까지 있는거고 무조건 전역 "변수"가 위치한다. (BSS 시작하자마자 다 0으로 초기화 되는데 이거 쓰려면 값을 넣어줘야하자나)
프로그램을 시작하는 시점에 값이 쓰여있어야하면 프로그램을 실행하는 도중에 값을 쓸 수도 안 쓸 수도있다. 컴파일 시점에서 결정된 값을 안바꾸고 계속쓰는 데이터의 경우. 그러니까 printf("Hello world!"); 할때 Hello world! 같은 문자열같은거. 이런건 프로그램이 실행되는 과정에서 변경될 필요가 전혀없다. 그래서
데이터 영역에 읽기쓰기권한이 모두 있는 영역이 있고 => for 초기화된 전역변수
데이터 영역에 읽기권한만 있는 영역이 있다. => rodata. for 전역"상수" (단순 문자열)
어찌되었던 초기화된 전역변수 / 전역상수 모두 프로그램이 시작하는 시점에 값이 유지되어야 하기때문에 데이터 세그먼트 영역에 들어간다.
데이터 vs rodata 세그먼트
데이터 세그먼트는 프로그램 시작시점에서 초기화된 전역변수들이 위치하는 영역이고,
그 영역안에 이제 읽기, 쓰기권한이 모두 있는 영역이 있고 읽기권한만 있는 영역이있다.
데이터 세그먼트 안에 읽기권한만 있는 영역이 바로 rodata 세그먼트이다.
자 이렇게 글로만 보면 이해가 잘 안되는데, 드림핵 문제를 풀면서 보자
BSS 세그먼트 : 초기화 안된 전역변수 (int c;)
데이터 세그먼트 : 초기화된 전역변수(int a = 0xa;) / 전역상수 ("d_str")
rodata 세그먼트 : 변경할 필요가 없는 전역상수 ("d_str")
'공부 > JUN STUDY' 카테고리의 다른 글
PLT와 GOT 그리고 동적 라이브러리 (0) | 2022.05.18 |
---|---|
MOV와 LEA 어셈블리어 차이 그리고 []의 의미 (RAX와 [RAX]의 차이) (1) | 2022.03.30 |
메모리 vs 레지스터 (메모리가 있는데 레지스터 왜 또 쓸까?) (0) | 2022.03.30 |
x86-64 ISA(Instruction Set Architecture)의 여러가지 이름 (Intel64, IA-32e, EM64T, amd64 이거 다 같은거다) (0) | 2022.03.30 |
컴퓨터의 주소표현 (포인터의 크기 & 표현가능한 메모리 주소가 크면 좋은 이유) (0) | 2022.03.30 |