문제

저의 고유 한 GCC는 트리플렛이 다음과 같이 말합니다.

> gcc -dumpmachine
x86_64-suse-linux

CPU-Vendor-OS가 해당 x86_64, Suse, Linux 인 경우. 후자는 glibs가 사용되고 있음을 의미합니다 (?). Cross-Compiling BusyBux 기반 시스템을 수행 할 때 Compiler Triplet은 AVR32-Linux-UCLIBC와 같은 것입니다. 여기서 OS는 'Linux-UCLIBC'입니다.

'linux-glibc'와 'linux-uclibc'의 차이는 Collect2 동작 및 libgcc.a 컨텐츠에서 (Afaiu)입니다. glibc 또는 uclib는 대상 바이너리에 조용히 연결됩니다.

질문은 동일한 컴파일러에 의해 Linux 커널을 어떻게 컴파일 되었습니까? 커널이 베어 메탈에서 실행 되 자마자 어떤 종류의 사용자 공간 LIBC와 연결되어서는 안되며, 적절한 LIBGCC.A를 사용해야합니다.

도움이 되었습니까?

해결책

GCC에는 작동 방식을 제어 할 수있는 모든 종류의 옵션이 있습니다. 다음은 몇 가지 관련이 있습니다.

  • -nostdlib 표준 라이브러리 및 시작 코드에 링크를 생략하려면
  • -nostdinc 표준 위치에서 헤더 파일 검색을 생략합니다.
  • -ffreestanding 독립형 환경 (예 : 커널)을 컴파일하려면

또한 링크를 위해 GCC를 사용할 필요가 없습니다. 링커를 직접 호출하고 고유 한 링커 맵, 시작 객체 코드 및 필요한 다른 것을 제공 할 수 있습니다.

Linux 커널 빌드는 사용하지 않는 임의의 이유로 보입니다. -ffreestanding 그러나 링크 스테이지를 제어하고 사용자 공간 코드를 가져 오지 않고 커널이 연결되도록합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top