IT이야기

C에서 메인() 없이 프로그램 컴파일 및 실행

cyworld 2022. 4. 26. 22:05
반응형

C에서 메인() 없이 프로그램 컴파일 및 실행

다음 프로그램을 컴파일하여 실행하려고 하는데main()에서 기능하다.C. 다음 명령어를 사용하여 프로그램을 편집했다.

gcc -nostartfiles nomain.c

그리고 컴파일러는 경고를 한다.

/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400340

좋아요, 문제 없습니다.그리고 실행 가능한 파일(a.out)을 실행했다.printf문이 성공적으로 인쇄된 다음 분할 오류를 가져오십시오.

그렇다면, 제 질문은 "인쇄문을 성공적으로 실행한 후 왜 분할 오류가 발생하는가?" 입니다.

내 코드:

#include <stdio.h>

void nomain()
{
        printf("Hello World...\n");
        printf("Successfully run without main...\n");
}

출력:

Hello World...
Successfully run without main...
Segmentation fault (core dumped)

참고:

여기,-nostartfilesgcc 플래그는 컴파일러가 링크할 때 표준 시작 파일을 사용하지 못하도록 차단한다.

프로그램의 생성된 어셈블리를 살펴봅시다.

.LC0:
        .string "Hello World..."
.LC1:
        .string "Successfully run without main..."
nomain:
        push    rbp
        mov     rbp, rsp
        mov     edi, OFFSET FLAT:.LC0
        call    puts
        mov     edi, OFFSET FLAT:.LC1
        call    puts
        nop
        pop     rbp
        ret

참고:ret명세서프로그램 진입점이nomain모든 게 다 괜찮다.하지만 함수가 돌아오면 호출 스택의 주소로 뛰어들려고 해...사람이 살지 않는 곳이야그것은 불법적인 접근이고 분할 결함이 뒤따른다.

빠른 해결책은 전화를 거는 것이다.exit()당신의 프로그램이 끝날 때 (그리고 C11을 가정할 때 우리는 그 기능을 다음과 같이 표시하는 것이 좋겠다._Noreturn):

#include <stdio.h>
#include <stdlib.h>

_Noreturn void nomain(void)
{
    printf("Hello World...\n");
    printf("Successfully run without main...\n");
    exit(0);
}

사실, 이제 당신의 기능은 일반인과 거의 비슷하게 행동한다.main기능, 에서 돌아온 이후부터mainexit을 가지고 기능을 호출하다.main의 반환 값

C에서 함수/하위 루틴이 (순서에 따라) 스택으로 채워지는 경우:

  1. 그 논쟁들,
  2. 반송 주소,
  3. 로컬 변수, --> 스택의 맨 위

main()이 시작점이 되는 ELF는 어떤 지침이 먼저 나오든 먼저 밀릴 수 있도록 프로그램을 구성한다. 이 경우 printfs는 다음과 같다.

이제 반환 주소 OR 없이 프로그램이 잘림__end__그리고 그것은 그 스택에 있는 것이 무엇이든 가정한다.__end__) 위치는 반송 주소지만, 불행히도 그렇지 않아 충돌한다.

참조URL: https://stackoverflow.com/questions/42328165/compile-and-run-program-without-main-in-c

반응형