2012-10-30 2 views
0

기본적으로 소형 ARM 컴퓨터 인 Raspberry Pi 용으로 크로스 컴파일하려고합니다. 호스트는 Arch Linux를 실행하는 i686 상자가됩니다.Distro 제공 크로스 컴파일러 대 커스텀 빌드

내 첫 번째 본능은 아치 리눅스, arm-elf-gcc-base 및 arm-elf-binutils에서 제공하는 크로스 컴파일러를 사용하는 것입니다. 그러나, 모든 위키와 내가 읽은 글은 사용자 정의 gcc 빌드의 일부 버전을 사용하는 것으로 보입니다. 그들은 자신의 gcc를 요리하는데 많은 시간을 소비하는 것 같습니다. 문제는 gcc를 다른 gcc보다 중요하게 사용하는 이유가 무엇인지 말하지 않는다는 것입니다.

  1. 일반 커널 및 응용 프로그램에서 Raspberry Pi 또는 ARM을 빌드 할 때 배포판에서 제공되는 크로스 컴파일러를 사용할 수 있습니까?

  2. ARM 아키텍처 용으로 여러 개의 컴파일러가 필요합니까? 그렇다면 왜 단일 gcc가 모든 x86 변형을 지원할 수 있습니까?

  3. 2)라면, gcc의 특정 버전에서 지원되는 대상 하위 집합을 어떻게 추론 할 수 있습니까?

  4. 더 일반적인 질문, 일반적인 gcc 빌드에 대해 어떤 일반적인 사용 사례가 필요합니까?

가능한 한 기술적으로 기술하십시오. 이유는 무엇입니까?

+0

예 사전 제작 된 것을 사용할 수 있습니다. gcc 또는 binutils 소스를 다운로드 한 다음 ./configure --help를 실행하여 선택 항목을 살펴보십시오. 사용자 정의 대 사전 빌드에 대해 다를 수 있고 선택할 수있는 옵션이없는 경우 선택 사항을 확인하십시오. 미리 만들어진 사람은 한 사람의 선호도를 사용하는 관습 일뿐입니다. 또한 사용자 정의를 사용하여 특정 버전의 gcc를 사용할 수 있습니다.또한 codesourcery (현재 멘토)와 같은 pre-builts는 여러 가지 이유로 소스에 대한 개선이나 변경이 있습니다 (안정적인 소스가 아닌 대상 코어 또는 운영 체제에 대한 지원 추가 또는 수정). –

+0

sigle gcc가 모든 x68 변형을 지원할 수 있습니다. 성명의 막연한, gcc 2.95는 2012 년 출시 된 x86 기능을 지원할 수 없습니까? 아니. 같은 이유로 여러 x86 배포판이나 응용 프로그램과 함께 사용자 정의 gcc 빌드를 볼 수 있습니다. gcc가 완벽하고 전혀 버그가없고 완료 되었으면 (지원되는 모든 기능, 완료, 버그가없는 경우) 새 프로세서를 추가하는 것 외에 gcc에 대한 업데이트가 없을 것입니까? gcc에서 개발이 끝나고 버그가 없다는 것을 알지 못합니다. –

+0

성공적으로 gnu 기반 크로스 컴파일러를 빌드하면 배포판에 필요한 모든 응용 프로그램이나 드라이버를 빌드 할 필요가없는 작업을 수행 할 수 있습니다. gcc 내부를 파다 보면 덕트 테이프와 베일 링 와이어와 함께 붙어 다니는 못생긴 짐승을 발견 할 수 있습니다. 그 짐승을 길들이는 것을 배우는 데는 상당한 시간이 걸립니다 (단지 각 릴리스를 다시 배워야 만합니다). –

답변

2

개발자가 자신의 (호스트)와 비교하여 다른 컴퓨터 (대상)의 소프트웨어 작성 (크로스 컴파일)에 대해 이야기 할 때 이진 파일을 작성하는 데 필요한 도구 세트를 설명하기 위해 toolchain이라는 용어를 사용합니다. 실행 가능한 바이너리를 빌드해야 할 때 컴파일러 이상이 필요하기 때문입니다.

운영 체제 및 표준 라이브러리의 요구 사항에 따라 런타임을 초기화하려면 루틴 (crt0.o)이 필요합니다. 표준 라이브러리 집합이 필요하며 라이브러리는 시스템 호출 API 및 여러 os 수준 구성 (예 : 페이지 크기) 및 데이터 구조 (예 : 시간 구조)로 인해 대상의 커널을 인식해야합니다.

하드웨어 측면에는 다양한 ARM 아키텍처 집합이 있습니다. 아키텍처는 이전 버전과 호환 될 수 있지만 기본적으로 툴 체인은 바이너리이며 특정 아키텍처를 대상으로합니다. 기본적으로 가장 널리 보급 된 아키텍처를 사용할 수 있지만 이미 제한된 환경 (임베디드 장치)에서는 그다지 효과가 없습니다. 최신 아키텍처를 사용하는 경우 이전 아키텍처 기반 대상에는 유용하지 않습니다.

호스트 용 호스트에 바이너리를 빌드 할 때 컴파일러는 자체 환경에서 필요한 모든 비트를 찾거나 호스트에있는 것을 사용할 수 있으므로 대부분의 위의 세부 사항은 개발자가 볼 수 없습니다. 그러나 호스트 유형과 다른 타겟을 빌드 할 때 툴체인은 하드웨어, OS 및 표준 라이브러리 세부 정보를 알아야합니다. 툴체인에게 이런 말을하는 방법은 부트 스트래핑을 어느 정도 필요로하는 세부 사항에 따라 툴체인을 구축하는 것입니다. (또는 toolchain이 지원/구축 된 경우 광범위한 매개 변수를 통해이 작업을 수행 할 수 있습니다.)

일반적인 크로스 컴파일 도구 체인이있을 때 이미 특정 대상 설정이되어있어 요구 사항. 우분투의 상황에 대한 최근 question을 참고하십시오.

+0

binutils 및 gcc (gnu 기반 툴 체인)를 사용하면 기본 (arm) 대상 프로세서가 있지만 명령 행에서 다른 대상을 지정할 수 있습니다. 그리고 그것으로 코드를 생성 할 수 있지만 (C에서 asm을 바이너리로 변환) 툴 체인 (libgcc, libc 등)의 다른 라이브러리와 반드시 링크 할 필요는 없습니다. 따라서 툴체인은 ARMv6을 기본으로 할 수 있습니다. 예를 들어 ARMv4 코드를 컴파일 할 수는 있지만 툴체인의 특성에 따라 링크 할 수도 있고 연결하지 않을 수도 있습니다. –

+0

툴체인이 특정 ARM 코어 버전을 지원하는지 어떻게 알 수 있습니까? 일치해야하는 매개 변수는 무엇입니까? 지금까지 나는 그것이 '핵심', 'Soft/HardFP', 'ko/elf'및 crt라고 생각하십니까? 이게 사실인가요, 그리고 나는 뭔가를 놓치고 있습니까? – mikijov

+0

gcc -v는 gcc가 어떻게 구성되어 있는지 인쇄합니다. toolchain 접두사 (arm-linux-gnueabihf-와 같이)는 hardfp (hf)인지 알 수 있지만 libc 또는 crt stuffs 옵션을 읽는 방법을 모르겠습니다. - 당신이 코어 또는 코/엘프의 의미를 이해하지 못했습니다. – auselen

관련 문제