<aside> 💡
Loading이란,
</aside>
linux> ./prog
prog
은 내장 쉘 명령어에 대응되지 않음
→ “실행 가능한 목적 파일”이라고 가정됨
→ 따라서, loader라고 알려진 메모리 상주 OS 코드를 호출하여 실행
Loader는 디스크로부터 실행 가능한 목적 파일 내의 코드와 데이터를 메모리로 복사
<aside>
리눅스 x86-64 런타임 메모리 이미지 (출처 : CSAPP Fig. 7.15)
</aside>
x86-64
리눅스 시스템에서 코드 세그먼트는 주소 0x400000에서 시작
뒤이어 데이터 세그먼트 / 런타임 힙 / malloc
라이브러리 호출하여 위로 성장
그 후에는 공유 모듈들을 위해 예약된 영역이 존재
사용자 스택
스택 위는 OS의 메모리 상주 부분인 커널의 코드 / 데이터를 위해 예약
링커는 런타임 주소를 스택 / 공유 라이브러리 / 힙 세그먼트에 할당할 때
로더가 돌아갈 때, 메모리 이미지를 생성
프로그램 헤더 테이블에 따라 실행 파일의 덩어리를 코드와 데이터 세그먼트로 복사
프로그램의 엔트리 포인트로 점프, _start
함수의 주소가 됨
crt1.o
에 정의_start
→ __libc_start_main
호출(시스템 초기화 함수)
libc.so
에 정의main
함수 호출, 리턴 값 처리, 제어권 커널로 넘겨주는 역할