⭐️ 7.9. Loading Executable Files
DUMP
- 셸의 기본 내장 커맨드인지 여부를 판단한다. -> 아니라면 해당 명령어를 실행가능한 목적파일로 간주하여 현재 위치와 환경변수 PATH에 일치하는 놈이 있는지 찾아본다.
- 있으면 OS에서 24/7 돌아가는 로더에게
execve
명령을 호출한다. 로더는 실행가능한 목적파일을 디스크에서 메모리로 올린 다음 첫번째 실행주소(entry point)로 PC를 옮기는 것으로 자기 할 일을 마친다. - code 세그먼트는
0x40_00_00
에서 출발한다. 그 아래엔 data 세그먼트가 있고. heap 세그먼트는 데이터 세그먼트의 끝자락에 붙어있으며(어차피 증가감소하지 않을 거니까)malloc
에 의해 늘어났다 줄어들었다 할 것임. 스택 세그먼트는 유저가 접근할 수 있는 데이터 영역의 마지막 주소인1 << 48 - 1
부터 시작하며 아래로 내려간다. 스택 위에는 커널코드로 예약되어 있다. - 모든 세그먼트는 완벽히 붙어있는 건 아님. 다만 align 되어있을 뿐.
- 로더는 메모리 영역의
.data
,.text
세그먼트에 각각을 복붙한다. 로더는 프로그램의 entry point로 점프하고, 모든 C 프로그램은_start
함수의 주소값을 가지고 있다. 저 함수는 시스템 이진 목적파일crt1.o
안에 정의되어 있다._start
함수는__libc_start_main
이라는 함수를 호출하는데, 그 안에서 프로세스의 환경을 설정한 뒤에 비로소 유저가 정의한main
함수를 호출한다.