_start가 내 프로그램의 주요 기능과 기타 기본 설정 기능을 호출합니까? [폐쇄]

_start가 내 프로그램의 주요 기능과 기타 기본 설정 기능을 호출합니까? [폐쇄]

로더 작동 방식을 설명하는 교과서를 읽고 있습니다.

로더가 실행되면 실행 가능한 개체 파일의 블록을 코드 및 데이터 세그먼트에 복사합니다. 다음으로, 로더는 항상 함수의 주소인 프로그램의 진입점으로 점프합니다. _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

내 질문은 다음과 같습니다

  1. 한번 objdump프로그램의 어셈블리 코드를 확인해 보니 _start아래와 같은 호출만 있는 것을 발견했습니다.__libc_start_main

    여기에 이미지 설명을 입력하세요.

    call __setup_for_c등 의 다른 기능은 어떻습니까 _main? 특히 내 프로그램의 주요 기능이 어떻게 호출되는지 알 수 없습니다. 그렇다면 실행 흐름에 대한 의사 코드가 올바른가요?

  2. __libc_start_main표준 라이브러리를 설정한다는 것은 무엇을 의미합니까? 왜 표준 라이브러리를 설정해야 합니까? 표준 라이브러리는 프로그램이 로드될 때 동적 링커를 통해서만 연결하면 되는 것 아닌가요?

답변1

  1. _dl_start_user연결된 답변에 설명된 다른 함수 호출은 "생성자"( ) 또는 를 사용하여 GNU C 라이브러리에서 발생해야 하는 실제 구현 세부 사항에 대한 개요를 제공 합니다 __libc_start_main. 볼 수 없나요?__libc_start_mainmain라고분해 시 해당 주소가 전달됩니다( 참조 lea) callq. __libc_start_main또한 프로그램이 종료되고 반환되지 않는 책임도 있습니다. 함수가 반환되면 프로그램이 중단됩니다 hlt.callq

  2. 오늘날 라이브러리에는 많은 설정이 필요합니다.

    • 일부 자신의 재배치
    • 스레드 로컬 저장소 설정
    • 병렬 스레드 설정
    • 소멸자 등록
    • vDSO 설정(Linux)
    • ctype 초기화
    • 프로그램 이름, 인수 및 환경을 다양한 라이브러리 변수에 복사

    등. x86-64 관련 내용을 참조하세요.sysdeps/x86_64/start.S그리고 일반csu/libc-start.c,csu/init-first.c, 그리고misc/init-misc.c다른 것들 사이.

관련 정보