programing

C에서 _start()의 용도는 무엇입니까?

prostudy 2022. 6. 4. 08:10
반응형

C에서 _start()의 용도는 무엇입니까?

나는 동료로부터 C 프로그램을 쓰고 실행할 수 있다는 것을 배웠다.main()기능.다음과 같이 실행할 수 있습니다.

my_main.c

/* Compile this with gcc -nostartfiles */

#include <stdlib.h>

void _start() {
  int ret = my_main();
  exit(ret); 
}

int my_main() {
  puts("This is a program without a main() function!");
  return 0; 
}

다음 명령을 사용하여 컴파일합니다.

gcc -o my_main my_main.c –nostartfiles

다음 명령을 사용하여 실행합니다.

./my_main

이런 일은 언제 해야 하나요?이것이 유용한 실제 시나리오가 있습니까?

기호_start프로그램의 시작점입니다.즉, 이 기호의 주소는 프로그램 시작 시 점프된 주소입니다.일반적으로 이름이 있는 함수는_start라는 파일에 의해 제공됩니다.crt0.o여기에는 C 런타임 환경의 시작 코드가 포함되어 있습니다.몇 가지 정보를 설정하고 인수 배열을 채웁니다.argv는 인수의 수를 카운트하고 콜을 실행합니다.main.끝나고main돌아온다,exit호출됩니다.

프로그램이 C 런타임 환경을 사용하지 않을 경우 프로그램 자체의 코드를 제공해야 합니다._start예를 들어 Go 프로그래밍 언어의 레퍼런스 실장은 스택에서 약간의 마법을 필요로 하는 비표준 스레드 모델이 필요하기 때문에 그렇게 합니다.자신의 것을 공급하기 위해서도 편리합니다._start아주 작은 프로그램이나 틀에 박히지 않은 일을 하는 프로그램을 만들고 싶을 때.

다음은 이전 프로그램 시작 시 발생한 작업에 대한 개요입니다. main특히, 그것은 그것을 보여준다.__start는 OS의 관점에서 사용하는 프로그램의 실제 시작점입니다.

명령 포인터가 프로그램에서 카운트를 시작하는 첫 번째 주소입니다.

코드는 단지 하우스키핑을 하기 위해 몇 가지 C 런타임 라이브러리 루틴을 호출하고, 그 다음 콜을 호출합니다.main그리고 나서 물건을 내려놓고exit출구 코드가 무엇이든main반환했다.


천 마디 말보다 한 장의 사진이 더 낫다.

C 런타임 시작 다이어그램


추신: 이 답변은 SO가 이 질문의 중복으로 유용하게 마무리한 다른 질문에서 가져온 것입니다.

하는 동안에main프로그래머의 관점에서 보면 프로그램의 시작점이 됩니다._startOS의 관점에서는 통상적인 엔트리 포인트입니다(OS에서 프로그램을 기동한 후에 실행되는 첫 번째 명령).

일반적인 C, 특히 C++ 프로그램에서는 실행이 메인화되기 전에 많은 작업이 수행되었습니다. 특히 글로벌 변수 초기화 같은 것들이요. 여기에서는, 그 사이에 일어나는 모든 일에 대한 좋은 설명을 찾을 수 있습니다._start() ★★★★★★★★★★★★★★★★★」main()또한 메인 종료 후에도 마찬가지입니다(아래 주석 참조).
파일로 는 " " " " " " " " 입니다.–nostartfiles기본적으로 컴파일러에게 다음과 같이 말합니다.표준 스타트업 파일을 줄 필요는 없습니다.처음부터 어떤 일이 일어나는지 완전히 제어할 수 있습니다.

이것은 경우에 따라서는 필요하기도 하고 임베디드 시스템에서 자주 사용됩니다.예를 들어 OS가 없고 글로벌 오브젝트를 초기화하기 전에 메모리 시스템의 특정 부분(캐시 등)을 수동으로 활성화해야 하는 경우입니다.

이런 일은 언제 해야 하나요?

프로그램에 고유한 시작 코드를 원할 때.

main는 C 첫 ._start을 사용하다

Linux의 예:

_start: # _start is the entry point known to the linker
    xor %ebp, %ebp            # effectively RBP := 0, mark the end of stack frames
    mov (%rsp), %edi          # get argc from the stack (implicitly zero-extended to 64-bit)
    lea 8(%rsp), %rsi         # take the address of argv from the stack
    lea 16(%rsp,%rdi,8), %rdx # take the address of envp from the stack
    xor %eax, %eax            # per ABI and compatibility with icc
    call main                 # %edi, %rsi, %rdx are the three args (of which first two are C standard) to main

    mov %eax, %edi    # transfer the return of main to the first argument of _exit
    xor %eax, %eax    # per ABI and compatibility with icc
    call _exit        # terminate the program

이것이 유용한 실제 시나리오가 있습니까?

, 델의 _start:

해 본 에서는, 인 「임베디드 소프트웨어」를 가 있습니다._start델의 특정 메모리 및 퍼포먼스 요건에 대해 설명합니다.

'', 'Dropping', 'Dropping' 입니다.main하다

아뇨, 그렇게 하는 게 이득이 될 것 같지 않아요.

언급URL : https://stackoverflow.com/questions/29694564/what-is-the-use-of-start-in-c

반응형