이유 중 하나는 GCC 를 자체 C 표준 라이브러리가있는 시스템 (예 : MacOSX, Solaris, HPUX 또는 일부 FreeBSD와 같은 독점 Unix 시스템)에서 빌드하고 사용할 수 있기 때문입니다 .
Linux에서도 GNU Glibc 가 아닌 C 표준 라이브러리를 사용할 수 있습니다 . 특히 musl-libc 또는 Bionic (Android 시스템) 또는 dietlibc 등이있는 Linux 시스템에서 GCC를 빌드하거나 사용할 수 있습니다. Linux 시스템은 GNU Glibc를 사용하고 Clang 과 같은 다른 C 컴파일러를 사용할 수 있습니다. 또는 TinyCC).
또한 C 라이브러리는 Linux 커널에 크게 의존합니다. 일부 이전 버전의 커널에는 특정 종류 (또는 버전)의libc
그리고 GCC는 크로스 컴파일러 로 빌드 할 수 있습니다.
" main
함수 호출 방법"과 같은 세부 사항 도 컴파일러에 따라 다르지만 실제로는 이러한 세부 사항이 libc.so
Linux 시스템에서 제공됩니다 .
정확하지 않습니다. 이 main
함수는 crt0에 의해 (호스팅 된 환경에서) 호출되며 , 그 중 일부는 GCC에서 제공합니다 (예 : /usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.o
내 Debian / Sid / x86-64는 libgcc-6-dev
패키지에서 제공). 에 대해 읽기libgcc
실제로, libc
많은 libc
헤더가 (선택적으로) 일부 gcc 내장 또는 함수 속성을 사용 하기 때문에 GCC와 GCC 간에 약간의 숨겨진 관계가 있습니다.
(따라서 GCC 개발자와 GNU libc 개발자는 상호 작용해야합니다)
.... 다른 ABI와 작동하도록 컴파일러를 변경하면 ...
/configure
GCC 컴파일러 가 필요합니다. GCC 컴파일러를 다시 빌드해야하며, ABI 및 호출 규칙 을 설명하기 위해 GCC 컴파일러 를 패치 해야 할 수도 있습니다 . X32 ABI는 좋은 예입니다.
마지막으로, GCC (나를 포함하여)의 공헌자 또는 관리자는 GCC에 대해서는 저작권이 있지만 GNU에는 해당되지 않는 저작권에 서명했습니다 glibc
.
(GCC 라이센스에 대해서는 GCC 런타임 라이브러리 예외를 주의 깊게 읽으십시오 )
GCC 와 같은 <limits.h>
또는 일부 표준 헤더 <stdint.h>
는 GCC에서 제공합니다. <stdlib.h>
GCC 빌드 중에 "고정 된" 것과 같은 다른 것들도있다 : 컴파일러 빌드 절차는 그것들을 Libc 구현에서 가져 와서 패치한다. 여전히 다른 표준 헤더 (아마도 <stdio.h>
포함 된 내부 헤더)는에서 가져옵니다 libc
. GCC FIXINCLUDES 및 고정 헤더 파일 에 대해 자세히 알아보십시오 .
(수정 사항은 내가 (Basile) 여전히 이해하지 못하는 것입니다.)
gcc -v -H
어떤 실제 프로그램이 실행되는지 ( gcc
드라이버, cc1
컴파일러, ld
& collect2
링커, as
어셈블러 등) 실행되는 헤더와 포함 된 헤더, 링크 된 라이브러리 및 오브젝트 파일 (더욱 정확한 프로그램)을보다 정확하게 이해하기 위해 컴파일 할 수 있습니다. C 표준 라이브러리 및 crt0을 포함하여 암시 적으로 ). GCC 옵션 에 대해 자세히 알아보십시오 .
BTW, 당신은 적절한 추가 인수를 우회 하여 GCC가 기대하거나 빌드 한 것과 다른 C 표준 라이브러리를 사용할 수 있습니다 (예 : musl-libc
일부 Dietlibc ) gcc
.