우리 책에 따르면 각 함수에는 C 런타임 스택에 활성화 레코드가 있습니다. 이러한 활성화 레코드 각각에는 반환 주소, 동적 링크 및 반환 값이 있습니다. 메인에도 이것들이 있습니까?main에 반송 주소, 동적 링크 또는 C의 반환 값이 있습니까?
답변
이 모든 용어는 순전히 구현 세부 정보입니다. C에는 "반송 주소"또는 "동적 링크"개념이 없습니다. 그것은 "스택"의 개념조차 가지고 있지 않습니다. 대부분 C의 구현에는 이러한 객체가 있고 해당 구현에서는 main
에 존재할 수 있습니다. 그러나 이것이 일어날 필요는 없습니다.
희망이 도움이됩니다.
함수를 디스 어셈블하면 스택에 반환 값 (대부분 EAX 레지스터가 수행하는 시간 (인텔 x86))이 포함되지 않은 경우가 대부분 있음을 알 수 있습니다. "호출 규칙"을 찾아 볼 수도 있습니다.이 규칙은 모두 컴파일러에 달려 있습니다. C는 언어입니다. 어떻게 기계어로 해석되는지는 '그'사업이 아닙니다.
C/C++에서 main()
은 함수처럼 쓰여지지만 하나가 아닙니다. 예를 들어 main()
을 호출 할 수 없으면 여러 개의 프로토 타입을 사용할 수 있습니다 (C!는 불가능 함). return
이 무엇이든지간에 운영 체제로 전달되고 프로그램이 종료됩니다.
개별 C 구현은 균일 성을 위해 "외부"에서 호출 된 함수처럼 main()
을 처리 할 수 있지만 아무도 그렇게하지 못하게합니다 (또는 아무에게도 알리지 않고 다른 형식으로 전환하지 못하게 함). C를 구현하는 전통적인 방법이 있지만 아무도 그런 식으로하지 않아도됩니다. 이는 일반적인 아키텍처에서 단순한 방법 일뿐입니다.
이것은 구현에 따라 다르지만 gcc로 컴파일 된 C 프로그램을 살펴 보는 것이 좋습니다. objdump -d executable
을 실행하면 해체 된 것을 볼 수 있으며 main()
의 동작을 볼 수 있습니다. 다음은 그 예이다 : 당신은 그 메인이 정상적으로 반환에 일정한 기능을 유사하게 작동 볼 수
08048680 <_start>: ... 8048689: 54 push %esp 804868a: 52 push %edx 804868b: 68 a0 8b 04 08 push $0x8048ba0 8048690: 68 30 8b 04 08 push $0x8048b30 8048695: 51 push %ecx 8048696: 56 push %esi 8048697: 68 f1 88 04 08 push $0x80488f1 804869c: e8 9f ff ff ff call 8048640 <__l[email protected]> 80486a1: f4 hlt ... 080488f1 <main>: 80488f1: 55 push %ebp 80488f2: 89 e5 mov %esp,%ebp 80488f4: 57 push %edi 80488f5: 56 push %esi 80488f6: 53 push %ebx ... 8048b2b: 5b pop %ebx 8048b2c: 5e pop %esi 8048b2d: 5f pop %edi 8048b2e: 5d pop %ebp 8048b2f: c3 ret
. 실제로 linux base 설명서를 보면 에서 볼 수있는 __libc_start_main
에 대한 호출에 실제로는 main
이 있어야 정상적인 기능을 수행 할 수 있습니다.
"C/C++"와 같은 언어가 없습니다. C에서'main'을 호출하는 것은 완벽하게 합법적입니다. –
@R, 그렇지 않습니다. _usually_ 작품 (많은 재미있는 oneliners이 악용),하지만 그것은 표준에 의해 전혀 허용되지 않습니다. – vonbrand
예. C와 C++을 혼동스럽게합니다. C++은'main'을 호출하는 것을 금지합니다. 왜냐하면'main' (전통적인 cfront 접근법)의 시작 부분에 주입 된 특별한 코드를 통해 전역 ctors가 구현되는 구현을 허용하기 때문입니다. C는'main'에 아무런 제한을 두지 않습니다. 외부 연결이있는 일반적인 함수이므로 별도로 지정하지 않는 한 호출해야합니다. –