gcc、arm-linux-gccとarm-elf-gccの関係を浅く分析する

5210 ワード

gcc、arm-linux-gccとarm-elf-gccの関係を浅く分析する
組み込み型開発交流群2803522802、ようこそ!
一、GCC紹介
The GNU Compiler Collectionは、通常GCCと略称され、GNUが開発したコンパイラセットですが、なぜコンパイラではなくエディタセットなのでしょうか.それはC言語のコンパイルだけでなく、C++、Ada、Objective Cなど多くの言語をサポートしているからです.またGCCのハードウェアプラットフォームに対するサポートは、X 86プロセッサアーキテクチャだけでなく、ARM、Motorola 68000、Motorola 8800、AtmelAVR、MIPSなどのプロセッサアーキテクチャもサポートしています.
二、GCCの構成構造
GCCの内部構造は主にBinutils、gcc-core、Glibcなどのパッケージから構成されている.
  • Binutils:コネクタ、アセンブリ、ターゲットファイルおよびアーカイブ用のその他のツールを含む開発ツールのセットです.BinutilsについてはBinutilsを参照して簡単に説明できます.このパッケージは、異なるターゲットマシンのプラットフォームに依存します.ターゲットマシンによって命令セットが異なるため、armとx 86は異なる.
  • gcc-core:注明の意味はGCCの核心部分であり、この部分はcのコンパイラおよび共通部分のみを含むが、他の言語(C++、Adaなど)のサポートパッケージには別途インストールが必要であることも、GCCがなぜこのように強力なのかの重要な原因である.gcc-coreはBinutilsに依存する.
  • Glibc:メモリの割り当て、ディレクトリの検索、ファイルの読み書き、文字列処理などの基本的なルーチンを提供する主要なcライブラリが含まれています.kernelとbootloaderはこのライブラリのサポートを必要としません.

  • 上記の3つのパケットがどのように動作しているかを例に挙げて説明します.cソースファイルtestがあります.cソースコードは以下の通りである.
    #include<stdio.h>
    int main(int argc, char *argv[])
    {
    	printf("Hello Linux!!
    "); return 0; }

    コンパイルコマンドはgcc-o test test.cコンパイル生成test実行可能ファイル.gccコンパイルプロセスは4つのステップに分けられる:前処理、コンパイル、
    アセンブリ、リンク.個人的には前処理とコンパイルは主にgcc-coreによって行われ,アセンブリとリンクは主にBinutilsによって行われると考えられる.
    完了します.ではglibcはいつ使われますか?ソースコードのprintf関数がないことを見て、この関数はGCCの中でライブラリの関数です
    数の形式は存在して、このライブラリの関数はglibcライブラリの中で、stdio.hヘッダファイルに宣言されます.
    総じて、上の3つのパッケージの役割を本当に理解すれば、GCCがどのように働いているのかが自然にわかります.
    三、クロスコンパイル
    クロスコンパイル(またはクロス確立)は、1つのマシン構造の下でコンパイルされたソフトウェアが別の全く異なるマシン構造の下で実行されるプロセスである.1つの一般的な例は、ARM、PowerPCまたはMIPSベースのターゲットマシンで実行されるコンパイルソフトウェアである.幸いなことに、GCCは、このプロセスが直面する困難を聞こえるよりもずっと小さくする.GCCの一般的なツールは通常、コマンドラインでコマンドを呼び出すことによって(gccなど)を使用して実行されます.クロスコンパイルを使用する場合、これらのツールはそのコンパイルのターゲットに基づいて名前が付けられます.たとえば、クロスツールチェーンを使用してARMマシンに簡単なHello Worldプログラムをコンパイルするには、arm-linux-gcc-o hello hello.cというコードを次のコマンドでコンパイルしてテストします.
    四、arm-linux-gcc
    arm-linux-gccはARMターゲットマシンベースのクロスコンパイルソフトで、arm-linux-gccはGCCに必要なインストールパッケージとは違いますが、名前だけが違うのはなぜでしょうか.
    x 86はARMが使用する命令セットとは異なるので、必要なbinutilsは異なるに違いない.gcc-coreはbinutilsに依存し、自然ARMはx 86で使用されるgcc-coreパッケージとは異なる.glibcは1つのcライブラリであり、最終的にはライブラリの形式でコンパイラに存在し、自然ARMで使用されるglibcライブラリはx 86と同様に異なり、その他はこのように推定される.
    五、arm-elf-gcc
    arm-elf-gccはarm-linux-gccと同様にARMターゲットマシンに基づくクロスコンパイルソフトウェアでもある.しかし、それらは同じクロスコンパイルソフトウェアではなく、両者には違いがあり、両者の違いは主に異なるCライブラリファイルを使用することにある.arm-linux-gccはGNUのGlibcを使用するが、arm-elf-gccは一般的にuClibc/uC-libcまたはRedHatを用いて組み込みシステムの開発に特化したCライブラリnewlibを使用する.ただ応用分野が異なるだけで、GlibcはPC向けに開発されており、uClibc/uC-libcはGlibc APIと互換性のある小型化されたC言語ライブラリであり、Glibcの一部機能を実現している.
    六、uClibc/uC-libc
    uClinuxには、uC-libcとuClibcの2つのよく使用されるlibcライブラリがあります.名前は似ていますが、違いがあります.その違いを簡単にご紹介します.uC-libcはuClinuxのために最初に開発されたライブラリであり、Jeff DionneとKenneth AlbanowskiがEKLsプロジェクトでm 68000のLinux-8086 Cライブラリのソースコードへの移植をサポートしている.uC-libcは完全なlibc実装であるが、apiは非標準であり、libcの規格も実装されていないものもある.uC−libcは、m 68000、ColdFire、およびMMUのないARMを安定的にサポートする.その主な設計目標は「小さい」、「軽い」であり、できるだけ標準と一致することであり、そのAPIは多くのlibcと互換性があるが、それが望むようにすべての標準と一致していないようだ.
    uClibcはこの問題を解決するためにuC-libcから発展した.そのすべてのAPIは標準的(正しい戻りタイプ、パラメータなど)であり、uC-libcでは実現されていないlibc標準を補い、現在は多くのアーキテクチャに移植されている.一般的には、アプリケーションがuClibcで書き換えられるようにglibcとできるだけ互換性があります.UClibcは、標準のVM linuxおよびUClinuxで使用できます.アプリケーションを簡潔にするために、MMUをサポートする多くのプラットフォームで共有ライブラリにコンパイルすることもできます.Erik AndersonはuClibcの背後で多くの仕事をした.UClibcは、m 68000、Coldfire、ARM、MIPS、v 850、x 86、i 960、Sparc、SuperH、Alpha、PowerPC、Hitachi 8の多くのシリーズのプロセッサをサポートしています.増加するプラットフォームのサポートにより、uClibcは新しいアーキテクチャに簡単に適応できるようになりました.uClinuxリリースでは、uC-libcまたはuClibcコンパイルを使用する環境を提供します.m 68000およびColdfireプラットフォームでは、uC-libcを選択するのは、共有ライブラリをサポートしているため、共有ライブラリはこれらのcpuでよく使用されるlibcであるため、少し良いです.uClibcもほとんどのプラットフォームとよく機能しています.
    Newlibは組み込みシステム用のオープンソースのC言語ライブラリで、libcとlibmの2つのライブラリから構成されており、軽量級で速度が速く、多くのCPU構造に移植できるのが特徴です.Newlibは、文字列サポート、浮動小数点演算、メモリ割り当て(mallocなど)、I/Oフロー関数(printf、fprinf()など)など、多くの複雑な機能を実現しています.libcはc言語ライブラリの実装を提供し、libmは浮動小数点演算のサポートを提供します.
    七、C言語ライブラリの選択
    ARMクロスコンパイラでgccコンパイラをコンパイルする場合、gccに対して異なるコンフィギュレーションオプションを指定する場合、使用するC言語ライブラリは異なり、gccコンパイラはデフォルトでGlibcを使用するか、uClibc/uC-libc(基本互換Glibc API)を使用するか、--with-newlibを使用する場合、gccコンパイラはGlibcを使用しません.Glibcをクロスコンパイルしない場合は、--with-newlibを使用してGlibcの接続を禁止し、bootstrap 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への接続を禁止しており、newlibなどの他のC言語ライブラリを使用してGCCツールチェーンをコンパイルすることができます.
    GCCツールチェーンには異なるC言語ライブラリが構成されていますが、これらのC言語ライブラリはGCCをサポートするために使用できるため、コアデータの処理に大きな違いはありません.したがってarm-linux-*とarm-elf-*の違いは主にC言語ライブラリの実装に現れ、例えば異なるシステム呼び出し、異なる関数セット実装、異なるABI/起動コード、および異なるシステム特性などのわずかな違いである.
    arm-linux-*とarm-elf-*の使用には絶対的な基準はなく、異なるライブラリの実装の違いを排除し、gccは任意のシステムをコンパイルすることができます.arm-linux-*とarm-elf-*は、ヌードマシンプログラムとオペレーティングシステムをコンパイルするために使用できますが、以下の説明に従うと、システムプログラムがより調整されます.
  • arm-linux-*linuxを実行するARMマシンについては、指定されたC言語ライブラリGlibcに依存します.Glibcのlinuxも使用するため、arm-linux-*はlinuxを実行するARMマシン上でコンパイルがより調和しています.
  • arm-elf-*は独立したコンパイルシステムであり、指定されたC言語ライブラリGlibcに依存せず、newlibなどの他のC言語ライブラリを使用することができ、オペレーティングシステムのサポートを必要とせず、組み込みシステムのために設計されたいくつかの軽量なC言語ライブラリを使用すると、監視プログラムなどのヌードマシンプログラム(linuxなどの大規模なオペレーティングシステムのプログラムがない)をコンパイルします.bootloaderなどは、システムプログラムをよりコンパクトかつ迅速にすることができます.