2017-09-05 1 views
0

커맨드 라인 인수가 어떻게 작동하는지 이해하려고합니다. 당신이 C에서 main() 기능이 포함 된 소스 코드를 컴파일 할 때 생성 된 오브젝트 파일은 CRT와 연결됩니다명령 줄 인수가 "두 번 전달"됩니까?

  • , 프로그램의 진입 점 :

    내가 어떻게 생각입니다 _start() 함수 (CRT에 있음)이고 _start()main()이라고합니다.

  • 는 몇 가지 명령 줄 인수를 프로그램을 실행하고 통과 할 때 이제 명령 줄 인수는 _start() 함수에 전달되고, 다음 _start()main()으로 명령 행 인수를 다시 전달합니다.

정확합니까?

+1

"이 될 부분으로 분할해야합니다."... 프로그램의 진입 점은 "main"함수가됩니다. 다른 것은 C 프로그램과 관련이 없습니다. 당신이 더 깊게 가고 싶다면, 이것은 C와는 관련이 없으며, 당신의 플랫폼에만 관련됩니다. Linux를 사용하여 crt 및 로더의 소스 코드를 읽고 간단한 프로그램을 한 단계 씩 실행합니다. 이 모든 것을 여기에서 설명하기에는 너무 광범위합니다. – Olaf

+0

인수 배열을 나타내는 포인터와 인수 개수가 전달됩니다. 인수 자체는 런타임에 의해 처리됩니다. – jxh

+0

명령 행을 해석하는 쉘은 매개 변수를 구문 분석하고 인수 배열을 채 웁니다. 그런 다음 컴파일러 특정 메서드를 통해 count 및 pointer를 main에 전달합니다 (스택에 넣거나 레지스터를 main을 호출하기 전에이 값으로 채 웁니다). – blackghost

답변

4

맞습니까?

예와 아니오 :

_start() 함수는 C 함수 만 어셈블러 작동하지 않습니다. 그 이유는 CPU가 C 프로그램에 필요한 "상태"가 아니기 때문에 _start() 함수는 C 코드를 실행하기 위해 CPU를 설정해야하기 때문입니다.

_start()이 호출 될 때 C 프로그램에서 필요로하는 "상태"와 CPU의 "상태"사이의 차이점은 방법 인수 (여기서는 명령 줄 인수)가 저장된다는 것입니다.

Linux에서 (적어도 32 비트 - 약 64 비트를 알지 못합니다.) 실제로 배열은 나중에 argv을 나타냅니다. _start()argv의 위치를 ​​계산 한 다음 계산 된 값을 main()으로 전달해야합니다.

Windows에서는 전체 명령 줄을 단일 문자열 (const char *)에 대한 포인터로 반환하는 함수가 있습니다! _start() 함수는 해당 함수를 호출 한 다음 문자열을 나중에 argv ...

+0

x86-64 Linux는 기본적으로 프로세스 입력시 스택 레이아웃과 같은 i386과 동일합니다. 하지만 argc와 포인터는 64 비트입니다. ABI는 세부 사항을 문서화합니다. https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI –

관련 문제