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)
참고:
여기,-nostartfiles
gcc 플래그는 컴파일러가 링크할 때 표준 시작 파일을 사용하지 못하도록 차단한다.
프로그램의 생성된 어셈블리를 살펴봅시다.
.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
기능, 에서 돌아온 이후부터main
그exit
을 가지고 기능을 호출하다.main
의 반환 값
C에서 함수/하위 루틴이 (순서에 따라) 스택으로 채워지는 경우:
- 그 논쟁들,
- 반송 주소,
- 로컬 변수, --> 스택의 맨 위
main()이 시작점이 되는 ELF는 어떤 지침이 먼저 나오든 먼저 밀릴 수 있도록 프로그램을 구성한다. 이 경우 printfs는 다음과 같다.
이제 반환 주소 OR 없이 프로그램이 잘림__end__
그리고 그것은 그 스택에 있는 것이 무엇이든 가정한다.__end__
) 위치는 반송 주소지만, 불행히도 그렇지 않아 충돌한다.
참조URL: https://stackoverflow.com/questions/42328165/compile-and-run-program-without-main-in-c
'IT이야기' 카테고리의 다른 글
C에서 stdout에게 쓴다는 것은 무슨 뜻인가? (0) | 2022.04.27 |
---|---|
IntelliJ에서 항아리를 제대로 만드는 방법? (0) | 2022.04.27 |
Vuetify 사용 방법Google Places API를 사용한 JS Advanced 슬롯 예제 (0) | 2022.04.26 |
Vuex 반환 부울? (0) | 2022.04.26 |
문자열이 있는 문자열 및 문자(프린트f 포함) (0) | 2022.04.26 |