기금넷 공식사이트 - 재경 문답 - arm-linux-gcc와 arm-elf-gcc의 차이점

arm-linux-gcc와 arm-elf-gcc의 차이점

ARM 기반 임베디드 시스템 개발에는 크로스 컴파일된 GCC 툴 체인의 두 가지 유형이 있습니다:

arm-linux-* 및 arm-elf-*, 둘 다 주요 차이점은 다른 C 라이브러리 파일을 사용한다는 것입니다. arm-linux-*는 GNU의 Glibc를 사용하는 반면 arm-elf-*는 일반적으로 uClibc/uC-libc 또는 임베디드 시스템용으로 특별히 개발된 REDHAT의 C 라이브러리

newlib.Glibc를 사용합니다. uClibc/uC-libc와 newlib는 모두 C 언어 라이브러리 파일이지만 서로 다른 분야에서 사용됩니다. Glibc는 PC용으로 개발되었으며, uClibc/uC-libc는 Glibc API와 호환되는 소형 버전입니다.

C Glibc의 일부 기능을 구현하는 언어 라이브러리입니다.

uClibc/uC-libc에 대한 지침은 다음을 참조하세요.

uClinux와 함께 일반적으로 사용되는 두 가지 libc 라이브러리가 있습니다.

uClibc. . 비슷한 이름에도 불구하고 상당히 다릅니다.

어떻게 다른지에 대한 간략한 개요는 다음과 같습니다.

uC-libc는 uClinux의 원본 라이브러리입니다.

Jeff Dionne과 Kenneth Albanowski가 추가한 m68000 지원을 포함하는 ELK 프로젝트의 일부였던 Linux-8086 C 라이브러리에서 가져온 것입니다.

libc 구현, 그러나 일부 API는 약간 비표준

이며 상당수의 일반적인 libc 루틴은 현재

m68000, ColdFire를 안정적으로 지원하지 않습니다. 및 ARM(비 MMU) 아키텍처는

작고 가벼운 무게를 갖는 것이지만 API는 모든 표준을 준수하려고 노력합니다. 대부분의 libcs와 호환되지만

항상 정확히 동일하지는 않습니다.

uClinux 배포판은 uC-libc 또는 uC-libc 또는

둘 중 하나를 사용하여 컴파일할 수 있는 환경을 제공합니다. 필요에 따라 uClibc를 선택하세요. m68000 및 Coldfire

플랫폼의 경우 일반적으로 공유 라이브러리를 지원하고 이러한 CPU에 가장 일반적으로 사용되는 libc인 uC-libc를 선택하는 것이 좋습니다. uClibc는 또한

배포판에서 지원하는 거의 모든 플랫폼에서 잘 작동합니다.

어떤 libc를 사용할지는 요구 사항에 따라 결정됩니다.

uClinux에는 두 가지가 있습니다. 자주 사용되는 libc 라이브러리: uC-libc 및 uClibc. 두 가지의 이름은 매우 유사하지만 실제로는 차이점이 있습니다. 두 가지의 차이점을 간략하게 소개합니다.

uC-libc는 uClinux용으로 개발된 최초의 라이브러리입니다. 이는 EKLs 프로젝트에서 m68000을 지원하기 위해 Linux-8086 C 라이브러리 소스 코드에서 Jeff Dionne과 Kenneth Albanowski에 의해 포팅되었습니다. uC-libc는 완전한 libc 구현이지만 일부 API는 비표준이고 일부 libc 표준은 구현되지 않습니다. uC-libc는 MMU 없이 m68000, ColdFire 및 ARM을 안정적으로 지원합니다. 주요 설계 목표는 "작음"과 "가벼움"이며 표준과 일치하도록 노력합니다. 비록 API가 많은 libcs와 호환되지만 이는 모든 표준과 일치하지 않는 것 같습니다.

uClibc는 이러한 문제를 해결하기 위해 uC-libc에서 개발되었습니다. 모든 API는 표준(올바른

반환 유형, 매개변수 등)이며, 이는 uC-libc에서 구현되지 않고 이제

여러 아키텍처에서. 일반적으로 uClibc를 사용하여 애플리케이션을 더 쉽게 다시 작성할 수 있도록 glibc와 최대한 호환됩니다.

uClibc는 표준 VM Linux 및 uClinux에서 사용할 수 있습니다. 애플리케이션 단순성을 위해 MMU를 지원하는 많은 플랫폼에서 공유 라이브러리로 컴파일할 수도 있습니다. Erik Anderson은 uClibc에서 많은 일을 해왔습니다

. uClibc는 m68000, Coldfire, ARM, MIPS, v850, x86, i960, Sparc, SuperH, Alpha, PowerPC 및 Hitachi 8과 같은 다양한 프로세서 시리즈를 지원합니다. 플랫폼 지원 증가는 uClibc

가 새로운 아키텍처에 쉽게 적응할 수 있음을 보여줍니다. uClinux 배포판은 uC-libc 또는 uClibc를 사용하여 컴파일하도록 선택할 수 있는 환경을 제공합니다. m68000 및 Coldfire 플랫폼의 경우 공유 라이브러리를 지원하고 공유 라이브러리가 libc이기 때문에 uC-libc를 선택하는 것이 약간 더 좋습니다. uClibc는 이러한 CPU에서 자주 사용됩니다

. 어떤 libc를 선택하느냐는 필요에 따라 다릅니다.

newlib는 임베디드 시스템용 오픈소스 C 언어 라이브러리로 libc와 libm 두 가지 라이브러리로 구성되어 있습니다.

가벼우며 빠른 속도로 이식이 가능합니다. 많은 CPU 구조에. newlib는 문자열 지원, 부동 소수점 연산, 메모리 할당(예: malloc) 및 I/O 스트림 함수(printf, fprinf()

등)를 포함하여 많은 복잡한 기능을 구현합니다.

그 중 libc는 c 언어 라이브러리의 구현을 제공하고 libm은 부동 소수점 연산 지원을 제공합니다.

ARM용 gcc 컴파일러를 크로스 컴파일할 때 gcc에 대해 다른 구성 옵션을 지정할 때 사용되는 C 언어 라이브러리가 다릅니다.

gcc 컴파일러는 기본적으로 Glibc를 사용합니다. uClibc/uC-libc를 사용할 수 있습니다(기본적으로 Glibc API와 호환됨).

--with-newlib를 사용할 때 gcc 컴파일러는 Glibc를 사용하지 않습니다. Glibc가 크로스 컴파일되지 않은 경우

--with-newlib를 사용하여 Glibc 연결을 비활성화하고 부트스트랩 gcc 컴파일러를 컴파일할 수 있습니다.

gcc 소스 디렉토리의

config/arm에 있는 t-linux 및 t-arm-elf에서 다른 --target이 gcc의 C 언어 연결에도 영향을 미치는 것을 볼 수 있습니다.

라이브러리 , t-linux(--target=arm-linux)는 기본적으로 Glibc를 사용하고, -arm-elf(--target=arm-elf)는

를 사용합니다.- Dinhibit_libc는 Glibc에 연결하는 것을 금지합니다. 그러면 다음을 사용할 수 있습니다. GCC 도구 체인을 컴파일하기 위한 newlib 및 기타 C 언어 라이브러리

.

GCC 툴체인은 서로 다른 C 언어 라이브러리로 구성되어 있지만 이러한 C 언어 라이브러리를 사용하여 GCC를 지원할 수 있으므로

핵심 데이터 처리에는 차이가 없습니다. 큰 접근성. 따라서 arm-linux-*와 arm-elf-*의 차이점은 주로 C 언어 라이브러리의 구현에 반영됩니다(예: 다양한 시스템 호출, 다양한 기능 세트 구현, 다양한 ABI\startup 코드 및

p>

시스템 특성의 차이 등 약간의 차이가 있습니다.

arm-linux-* 및 arm-elf-* 사용에 대한 절대적인 표준은 없습니다. 다양한 라이브러리 구현의 차이점을 제외하면 gcc는 모든 시스템을

컴파일할 수 있습니다. arm-linux-* 및 arm-elf-*는 모두 베어 메탈 프로그램과 운영 체제를 컴파일하는 데 사용할 수 있지만 다음 설명을 따르면 시스템 프로그램이 더 잘 조정된 것처럼 보입니다.

arm-linux-*가 목표입니다. Linux를 실행하는 ARM 시스템에서는 지정된 C 언어 라이브러리 Glibc에 의존합니다. Linux도 Glibc를 사용하므로 arm-linux-*는 Linux를 실행하는 ARM 시스템에서 더 조화롭게 보입니다.

arm-elf-*는 지정된 C 언어 라이브러리 Glibc에 의존하지 않는 독립적인 컴파일 시스템입니다. newlib와 같은 다른 C 언어 라이브러리를 사용할 수 있으며

필요하지 않습니다. 운영 체제를 지원합니다. 임베디드 시스템용으로 설계된 일부 경량 C 언어 라이브러리를 사용할 때 모니터링 프로그램, 부트로더 등과 같은 베어 메탈 프로그램(Linux와 같은 대규모 운영 체제가 없는 프로그램)을 컴파일합니다.

시스템 프로그램을 더 작고 빠르게 만들 수 있습니다.

Linaro 사전 구축 툴체인은 하드 및 소프트 부동 지점을 모두 지원합니다.

/linaro-toolchain-binaries/+milestone/2012.08에서 얻을 수 있습니다: ./arm-linux- gnueabihf-gcc -print-multi-lib

기본 구성은 --with-arch=armv7-a --with-tune=cortex-a9

--with-fpu입니다. =vfpv3-d16 --with-float=hard --with-mode=thumb

소프트 플로팅을 사용하려면 -marm -march=armv4t -mfloat-abi=soft 옵션이 필요합니다.

귀하의 경우 -march=armv5를 "-march=armv4t"로 변경해 보십시오.

cortex-a8 및 armv5로 구성을 변경하려면 필요합니다

*

samples/linaro-arm-linux-gnueabihf/crosstool.config에서 cortex-a9를 cortex-a8로 변경

* armv4t를 armv5로 변경

contrib/linaro/patches/gcc/linaro-4.7-2012.08/multilib.patch,

그런 다음 지침에 따라 툴체인을 다시 빌드하세요

(contrib/linaro/doc/ README.txt)

BTW: crosstool-ng-linaro는 eglibc용 multilib를 지원하지 않습니다.

Ubuntu Precise에서 사전 구축된 sysroot가 작동하지 않으면

http://crosstool-ng.org/에서 최신 crosstool-ng를 사용하세요.