Skip to content

⭐️ 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 되어있을 뿐.
  • [ ] 링커의 [[Address Space Layout Randomization]] 때문에 디버깅이 힘들어질 것이라는 말을 들었다. 보안 관련한 사항인걸로 아는데, 좀 더 자세히 알아보자.
  • Pasted image 20230908145952.png
  • 로더는 메모리 영역의 .data, .text 세그먼트에 각각을 복붙한다. 로더는 프로그램의 entry point로 점프하고, 모든 C 프로그램은 _start함수의 주소값을 가지고 있다. 저 함수는 시스템 이진 목적파일 crt1.o 안에 정의되어 있다. _start 함수는 __libc_start_main이라는 함수를 호출하는데, 그 안에서 프로세스의 환경을 설정한 뒤에 비로소 유저가 정의한 main 함수를 호출한다.