로더 작동 방식을 설명하는 교과서를 읽고 있습니다.
로더가 실행되면 실행 가능한 개체 파일의 블록을 코드 및 데이터 세그먼트에 복사합니다. 다음으로, 로더는 항상 함수의 주소인 프로그램의 진입점으로 점프합니다. _start
_start
함수는 시스템 시작 함수를 호출합니다.__libc_start_main
답변으로 판단하면이 스택 오버플로 질문, 실행 프로세스에 대한 다음과 같은 의사 코드가 있습니다.
_start:
call __setup_for_c ; set up C environment
call __libc_start_main ; set up standard library
call _main ; call your main
call __libc_stop_main ; tear down standard library
call __teardown_for_c ; tear down C environment
jmp __exit ; return to OS
내 질문은 다음과 같습니다
한번
objdump
프로그램의 어셈블리 코드를 확인해 보니_start
아래와 같은 호출만 있는 것을 발견했습니다.__libc_start_main
call __setup_for_c
등 의 다른 기능은 어떻습니까_main
? 특히 내 프로그램의 주요 기능이 어떻게 호출되는지 알 수 없습니다. 그렇다면 실행 흐름에 대한 의사 코드가 올바른가요?__libc_start_main
표준 라이브러리를 설정한다는 것은 무엇을 의미합니까? 왜 표준 라이브러리를 설정해야 합니까? 표준 라이브러리는 프로그램이 로드될 때 동적 링커를 통해서만 연결하면 되는 것 아닌가요?
답변1
_dl_start_user
연결된 답변에 설명된 다른 함수 호출은 "생성자"( ) 또는 를 사용하여 GNU C 라이브러리에서 발생해야 하는 실제 구현 세부 사항에 대한 개요를 제공 합니다__libc_start_main
. 볼 수 없나요?__libc_start_main
main
라고분해 시 해당 주소가 전달됩니다( 참조lea
)callq
.__libc_start_main
또한 프로그램이 종료되고 반환되지 않는 책임도 있습니다. 함수가 반환되면 프로그램이 중단됩니다hlt
.callq
오늘날 라이브러리에는 많은 설정이 필요합니다.
- 일부 자신의 재배치
- 스레드 로컬 저장소 설정
- 병렬 스레드 설정
- 소멸자 등록
- vDSO 설정(Linux)
- ctype 초기화
- 프로그램 이름, 인수 및 환경을 다양한 라이브러리 변수에 복사
등. x86-64 관련 내용을 참조하세요.
sysdeps/x86_64/start.S
그리고 일반csu/libc-start.c
,csu/init-first.c
, 그리고misc/init-misc.c
다른 것들 사이.