MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
インストール - GCCのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
インストール - GCC
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == RHELおよびSUSEのパッケージ管理システムで提供されているGCCのバージョンは古い可能性がある。<br> 最新のGCCでは、C++11からC++17を完全にサポートしており、また、C++20をサポートしている。<br> <br> また、最新のGCCでは、C11およびC++14のサポートがデフォルトで有効になっている。(-std=c11または-std=c++14を追加する必要はない)<br> <br><br> == GCCのインストール : ソースコードからインストール == ==== 依存関係のライブラリのインストール ==== まず、システムが最新であることを確認する。<br> # RHEL sudo dnf update # SUSE sudo zypper update <br> 依存関係のライブラリを、以下に示す2種類のいずれかの方法でインストールする。<br> <br> ===== パッケージ管理システムの使用 ===== # RHEL sudo dnf install gmp-devel mpfr-devel libmpc-devel isl-devel # SUSE sudo zypper install patterns-base-basesystem patterns-devel-base-devel_basis patterns-devel-C-C++-devel_C_C++ \ make tar gawk pkg-config m4 gperf bison flex gcc gcc-c++ gcc-32bit ncurses-devel expect-devel \ gmp-devel mpfr-devel mpc-devel isl-devel <br> ===== スクリプトの使用 ===== [https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf gcc-<バージョン>.tar.gz cd gcc-<バージョン> <br> ビルドに必要なライブラリをソースコードからビルドする場合、解凍したGCCのディレクトリに移動して、ライブラリをダウンロードする。<br> ./contrib/download_prerequisites <br> ダウンロードされた依存関係のライブラリを解凍する。<br> tar xf gmp-<バージョン>.tar.bz2 tar xf mpfr-<バージョン>.tar.bz2 tar xf mpc-<バージョン>.tar.gz tar xf isl-<バージョン>.tar.bz2 <br> ビルドに必要なライブラリを、ビルドしてインストールする。<br> * GMPのインストール ./gmp-<バージョン>/configure --prefix=<GCCのインストールディレクトリ> --enable-cxx make -j $(nproc) make check make install <br> * MPFRのインストール ./mpfr-<バージョン>/configure --prefix=<GCCのインストールディレクトリ> --with-gmp=<GCCのインストールディレクトリ> make -s -j $(nproc) make -s check -j $(nproc) make install <br> * MPCのインストール ./mpc-<バージョン>/configure --prefix=<GCCのインストールディレクトリ> --with-gmp=<GCCのインストールディレクトリ> --with-mpfr=<GCCのインストールディレクトリ> make -s -j $(nproc) make check -s -j $(nproc) make install <br> * ISLのインストール ./isl-<バージョン>/configure --prefix=<GCCのインストールディレクトリ> --with-gmp-prefix=<GCCのインストールディレクトリ> make -j $(nproc) make check make install <br> ==== GCCのインストール ==== [https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf gcc-<バージョン>.tar.xz cd gcc-<バージョン> <br> sha512.sumファイルを使用して、ダウンロードしたファイルのチェックを行う。<br> <code>sha512sum: gcc-<バージョン>.tar.gz: No such file or directory</code>というメッセージが表示されるが、<br> gcc-<バージョン>.tar.gzファイルをダウンロードしていないため表示されているだけなので、特に問題ない。<br> sha512sum --check sha512.sum <br> GCC 7.1をインストールする場合、/<GCC 7.1のソースディレクトリ>/libgcc/config/i386/linux-unwind.hファイルを、以下に示すように修正する必要がある。<br> <syntaxhighlight lang="c++"> // /<GCC 7.1のソースディレクトリ>/libgcc/config/i386/linux-unwind.hファイルの61行目 // 修正前 struct ucontext *uc_ = context->cfa; // 修正後 struct ucontext_t *uc_ = context->cfa; </syntaxhighlight> <br> GCCをビルドおよびインストールする。<br> オプションの説明を記載する。 * enable-languages=c,c++,fortran *: C、C++、FORTRANのコンパイラをビルド対象とする。 * disable-bootstrap *: <u>ただし、クロスコンパイラ向けでは使用できないことに注意すること。</u> *: 3-stage bootstrap buildの無効化。 * disable-multilib *: 64bit専用コンパイラとする。(ただし、<code>-m32</code>オプションが使用できなくなる) cd gcc-<バージョン> mkdir build && cd build <br> # GCC 7.5以降かつパッケージ管理システムで依存関係のライブラリをインストールしている場合 ../configure -v --build=x86_64-linux-gnu \ --host=x86_64-linux-gnu \ --target=x86_64-linux-gnu \ --prefix=<GCCのインストールディレクトリ> \ --program-suffix="_X_X" \ # gcc, g++ のファイル名を一意に指定する場合 --enable-languages=c,c++,fortran \ # C, C++, Fortranをインストールする場合 --disable-bootstrap # 3-stage bootstrap buildを無効化する場合 --enable-default-pie # PIEを有効にする場合 make -j $(nproc) make install-strip # GCC 7.5以降かつ手動で依存関係のライブラリをインストールしている場合 ../configure -v --build=x86_64-linux-gnu \ --host=x86_64-linux-gnu \ --target=x86_64-linux-gnu \ --prefix=<GCCのインストールディレクトリ> \ --program-suffix="_X_X" \ # gcc, g++ のファイル名を一意に指定する場合 --enable-checking=release \ --enable-languages=c,c++,fortran \ # C, C++, Fortranをインストールする場合 --disable-bootstrap \ # 3-stage bootstrap buildを無効化する場合 --enable-default-pie \ # PIEを有効にする場合 --with-gmp=<GMP, MPC MPFR, ISLのインストールディレクトリ> \ --with-mpc=<GMP, MPC MPFR, ISLのインストールディレクトリ> \ --with-mpfr=<GMP, MPC MPFR, ISLのインストールディレクトリ> \ --with-isl=<GMP, MPC MPFR, ISLのインストールディレクトリ> unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE export LD_LIBRARY_PATH=/<GMP, MPC MPFR, ISLのインストールディレクトリ>/lib64 make -j $(nproc) make install # GCC 6.5以前かつパッケージ管理システムで依存関係のライブラリをインストールしている場合 ../configure -v --build=x86_64-linux-gnu \ --host=x86_64-linux-gnu \ --target=x86_64-linux-gnu \ --prefix=<GCCのインストールディレクトリ> \ --program-suffix="_X_X" \ # gcc, g++ のファイル名を一意に指定する場合 --enable-checking=release \ --enable-languages=c,c++,fortran \ # C, C++, Fortranをインストールする場合 --disable-bootstrap \ # 3-stage bootstrap buildを無効化する場合 --disable-libsanitizer \ --disable-libcilkrts make -j $(nproc) make install-strip <br> ~/.profileファイル等に環境変数を設定する。<br> vi ~/.profile <br> <syntaxhighlight lang="sh"> # ~/.profileファイル export export PATH="/<GCCのインストールディレクトリ>/bin:$PATH" export LD_LIBRARY_PATH="/<GCCのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH" </syntaxhighlight> <br> 最後に、PCを再起動する。<br> <br> ==== GCCの設定 ==== GCCをソースコードからインストールした場合、共有ライブラリが <u>/<GCCのインストールディレクトリ>/lib64</u> ディレクトリ内に生成されるが、環境変数が設定されていない。<br> そのため、以下に示すいずれかの方法で環境変数のパスを通す必要がある。<br> <br> * システム全体に設定する場合 *: /etc/ld.so.confファイル * ユーザごとに設定する場合 *: ~/.profileファイル等 *: 環境変数 <code>LD_LIBRARY_PATH</code> を設定する。 <br> ===== システム全体に設定する場合 ===== /etc/ld.so.confファイルに <u>/<GCCのインストールディレクトリ/lib64</u> を追記することで、システム全体がライブラリを認識する。<br> sudo vi /etc/ld.so.conf <br> # /etc/ld.so.confファイル /<GCCのインストールディレクトリ/lib64 <br> 設定を反映させる。<br> ldconfig -v <br> <code>ldconfig</code> コマンドを実行した時に表示される情報から、<br> 以下に示すように、<u>/<GCCのインストールディレクトリ/lib64</u> ディレクトリが読み込まれていることを確認する。<br> /<GCCのインストールディレクトリ>/lib64: ldconfig: /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py is not an ELF file - it has the wrong magic bytes at the start. libatomic.so.1 -> libatomic.so.1.2.0 libitm.so.1 -> libitm.so.1.0.0 libgomp.so.1 -> libgomp.so.1.0.0 libquadmath.so.0 -> libquadmath.so.0.0.0 libssp.so.0 -> libssp.so.0.0.0 libmpxwrappers.so.2 -> libmpxwrappers.so.2.0.1 <br> <code>ldconfig</code> コマンドを実行した結果、以下に示すようなメッセージが表示される場合がある。<br> ldconfig: /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py is not an ELF file - it has the wrong magic bytes at the start. <br> これは、libstdc++.so.6.0.25-gdb.pyはpythonのスクリプトであるが、これを共有ライブラリとして認識していることが原因である。<br> file /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py: Python script, ASCII text executable <br> 対処方法としては、該当ファイルの名前を変更して、共有ライブラリと認識されないようする。<br> mv /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py \ /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py_org <br> 再度、<code>ldconfig</code> コマンドを実行する。<br> ldconfig -v <br> また、RHELおよびSUSEの場合、/etc/ld.so.confファイルに <u>include ld.so.conf.d/*.conf</u> と設定されている。<br> これは、ld.so.conf.dディレクトリ内のconf拡張子をもつファイルの内容を読み込むという意味である。<br> <br> システム全体に共有ライブラリのパスを設定するには、/etc/ld.so.conf.dディレクトリ内に該当するライブラリが存在するパスを記述した設定ファイルを作成する。<br> <br> 以下の例では、/etc/ld.so.conf.d/00-libstdc++.confファイルを作成している。<br> sudo vi /etc/ld.so.conf.d/00-libstdc++.conf <br> # 00-libstdc++.confファイル /<GCCのインストールディレクトリ>/lib64 <br> 設定を反映させる。<br> ldconfig -v <br> ===== 各ユーザごとに設定する場合 ===== この方法は、ユーザごとに設定する必要がある。<br> <br> ~/.profileファイル等に環境変数<code>LD_LIBRARY_PATH</code>を設定することにより、ユーザがログインする際に設定が読み込まれる。<br> vi ~/.profile <br> <syntaxhighlight lang="sh"> # ~/.profileファイル export LD_LIBRARY_PATH="/<GCCのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH" </syntaxhighlight> <br> 上記の設定を反映させるため、PCを再起動または再ログインする。<br> <br> ==== libstdc++を入れ替える場合 ==== <u>この手順を行う場合、システムが不安定になる可能性があることに注意する。</u><br> <br> 現在のlibstdc++の対応関係を確認する。<br> strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX <br> インストールしたGCCのlibstdc++.so.<バージョン名>をコピーする。<br> sudo cp /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.28 /usr/lib64 <br> /usr/lib64ディレクトリにあるlibstdc++.so.6ファイルのバージョンを確認する。<br> ls -ahlF /usr/lib64/libstd* <br> libstdc++.so.6ファイルを入れ替える。<br> sudo mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6_org sudo ln -s /usr/lib64/libstdc++.so.<バージョン名> /usr/lib64/libstdc++.so.6 <br> 正常にコピーできたか確認する。<br> ls -ahlF /usr/lib64/libstd* <br> 入れ替えたlibstdc++の対応関係を確認する。<br> strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX <br><br> == クロスコンパイラ向けGCCツールチェーンのインストール == ==== クロスコンパイラ向けGCCツールチェーンとは ==== クロスコンパイラ向けGCCツールチェインは、C/C++、アセンブリ言語のためのオープンソースのツール群である。<br> これは、各アーキテクチャのプロセッサを対象として実装している。<br> <br> ==== 共通 (ホスト側) ==== GCCツールチェーンのビルドに必要なライブラリをインストールする。<br> sudo zypper install expect-devel gmp-devel mpc-devel mpfr-devel <br> ==== PinePhone (AArch64) (システムルートあり) ==== まず、[https://ftp.gnu.org/gnu/binutils/ GNUの公式Webサイト]から、Binutilsをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf binutils-<バージョン>.tar.xz cd binutils-<バージョン> <br> ビルドディレクトリを作成する。<br> mkdir build && cd build <br> クロスコンパイラ向けBinutilsのビルドおよびインストールする。<br> <u>インストールディレクトリは、クロスコンパイラ向けGCCのインストールディレクトリと同じディレクトリであることに注意する。</u><br> ../configure CFLAGS="-g0 -O3 -fstack-protector-strong" \ # バッファオーバーフロー攻撃に対する中程度の保護を有効化 CXXFLAGS="-g0 -O3 -fstack-protector-strong" \ # バッファオーバーフロー攻撃に対する中程度の保護を有効化 --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=aarch64-linux-gnu \ --disable-gdb \ # GDBサポートを無効化 --disable-nls \ # 国際化サポートを無効化 --disable-multilib \ # マルチライブラリサポートを無効化 --disable-werror \ # 警告をエラーとして扱わない --enable-gold \ # GOLDリンカを有効化 (高速な代替リンカ) --enable-lto \ # リンク時最適化を有効化 --enable-plugins \ # プラグインサポートを有効化 --enable-relro \ # RELROセキュリティ機能を有効化 (リロケーションの読み取り専用化) --with-sysroot=<ターゲットのシステムルートディレクトリ> make -j $(nproc) make install <br> 次に、[https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードして解凍する。<br> または、以下のコマンドを実行してダウンロードする。<br> wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-<バージョン>/gcc-<バージョン>.tar.xz tar xf gcc-<バージョン>.tar.xz cd gcc-<バージョン> <br> クロスコンパイラ向けGCCをビルドおよびインストールする。<br> クロスコンパイラ向けGCCをビルドする場合、ネイティブ向けGCCとバージョンを合わせた方がよい。<br> export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ ../configure -v \ CFLAGS="-g0 -O3 -fstack-protector-strong" \ CXXFLAGS="-g0 -O3 -fstack-protector-strong" \ --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=aarch64-linux-gnu \ --enable-languages=c,c++ \ --disable-bootstrap \ --disable-multilib \ --disable-nls \ --with-sysroot=<ターゲットのシステムルートディレクトリ> make -j $(nproc) make install-strip <br> ==== Raspberry Pi 32bit (システムルートあり) ==== まず、[https://ftp.gnu.org/gnu/binutils/ GNUの公式Webサイト]から、Binutilsをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf binutils-<バージョン>.tar.xz cd binutils-<バージョン> <br> ビルドディレクトリを作成する。<br> mkdir build && cd build <br> クロスコンパイラ向けBinutilsのビルドおよびインストールする。<br> <u>インストールディレクトリは、クロスコンパイラ向けGCCのインストールディレクトリと同じディレクトリであることに注意する。</u><br> # Raspberry Pi Zero / 1 の場合 export ARCH=armv6 export FPU=vfp # Raspberry Pi 2 export ARCH=armv7-a export FPU=neon-vfpv4 # Raspberry Pi 3B の場合 export ARCH=armv8-a export FPU=vfp # Raspberry Pi 3B+ / 4B の場合 export ARCH=armv8-a export FPU=vfp または export FPU=neon-fp-armv8 ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=arm-linux-gnueabihf \ --disable-nls \ --disable-werror \ --disable-multilib \ --with-arch=$ARCH \ --with-fpu=$FPU \ --with-float=hard \ --with-sysroot=<ターゲットのシステムルートディレクトリ> make -j $(nproc) make install <br> 次に、[https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードして解凍する。<br> または、以下のコマンドを実行してダウンロードする。<br> wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-<バージョン>/gcc-<バージョン>.tar.xz tar xf gcc-<バージョン>.tar.xz cd gcc-<バージョン> <br> クロスコンパイラ向けGCCをビルドおよびインストールする。<br> # Raspberry Pi Zero / 1 の場合 export ARCH=armv6 export FPU=vfp # Raspberry Pi 2 export ARCH=armv7-a export FPU=neon-vfpv4 # Raspberry Pi 3B の場合 export ARCH=armv8-a export FPU=vfp # Raspberry Pi 3B+ / 4B の場合 export ARCH=armv8-a export FPU=vfp または export FPU=neon-fp-armv8 export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=arm-linux-gnueabihf \ --enable-languages=c,c++ \ --disable-multilib \ --with-arch=$ARCH \ --with-fpu=$FPU \ --with-float=hard \ --with-sysroot=<ターゲットのシステムルートディレクトリ> make -j $(nproc) make install-strip <br> ==== Raspberry Pi 64bit (システムルートあり) ==== まず、[https://ftp.gnu.org/gnu/binutils/ GNUの公式Webサイト]から、Binutilsをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf binutils-<バージョン>.tar.xz cd binutils-<バージョン> <br> ビルドディレクトリを作成する。<br> mkdir build && cd build <br> クロスコンパイラ向けBinutilsのビルドおよびインストールする。<br> <u>インストールディレクトリは、クロスコンパイラ向けGCCのインストールディレクトリと同じディレクトリであることに注意する。</u><br> # Raspberry Pi 3B /3B+ export ARCH=armv8-a export CPU=cortex-a53 # 最適化のためにオプションを調整することができる # Raspberry Pi 4B export ARCH=armv8-a export CPU=cortex-a72 # 最適化のためにオプションを調整することができる # Raspberry Pi 5の場合 export ARCH=armv8-a+crc+simd export CPU=cortex-a76 # 最適化のためにオプションを調整することができる ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=aarch64-linux-gnu \ --disable-multilib \ --with-arch=$ARCH \ --with-cpu=$CPU \ # 省略可能 --with-sysroot=<ターゲットのシステムルートディレクトリ> make -j $(nproc) make install <br> 次に、[https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードして解凍する。<br> または、以下のコマンドを実行してダウンロードする。<br> wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-<バージョン>/gcc-<バージョン>.tar.xz tar xf gcc-<バージョン>.tar.xz cd gcc-<バージョン> <br> クロスコンパイラ向けGCCをビルドおよびインストールする。<br> # Raspberry Pi 3B /3B+ export ARCH=armv8-a export CPU=cortex-a53 # 最適化のためにオプションを調整することができる # Raspberry Pi 4B export ARCH=armv8-a export CPU=cortex-a72 # 最適化のためにオプションを調整することができる # Raspberry Pi 5の場合 export ARCH=armv8-a+crc+simd export CPU=cortex-a76 # 最適化のためにオプションを調整することができる export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=aarch64-linux-gnu \ --enable-languages=c,c++ \ --disable-multilib \ --with-arch=$ARCH \ --with-cpu=$CPU \ # 省略可能 --with-sysroot=<ターゲットのシステムルートディレクトリ> make -j $(nproc) make install-strip <br> ==== RISC-V 64bit (システムルートあり) ==== まず、[https://ftp.gnu.org/gnu/binutils/ GNUの公式Webサイト]から、Binutilsをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf binutils-<バージョン>.tar.xz cd binutils-<バージョン> <br> ビルドディレクトリを作成する。<br> mkdir build && cd build <br> クロスコンパイラ向けBinutilsのビルドおよびインストールする。<br> <u>インストールディレクトリは、クロスコンパイラ向けGCCのインストールディレクトリと同じディレクトリであることに注意する。</u><br> ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=riscv64-linux-gnu \ --disable-nls \ --disable-werror \ --with-sysroot=<ターゲットのシステムルートディレクトリ> make -j $(nproc) make install <br> インストールされているBinutilsのバージョンを確認するには、以下に示すコマンドを実行します。<br> ld --version <br> 次に、[https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードして解凍する。<br> または、以下のコマンドを実行してダウンロードする。<br> wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-<バージョン>/gcc-<バージョン>.tar.xz tar xf gcc-<バージョン>.tar.xz cd gcc-<バージョン> <br> export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=riscv64-linux-gnu \ --enable-languages=c,c++ \ --disable-multilib \ --disable-nls \ --with-sysroot=<ターゲットのシステムルートディレクトリ> make -j $(nproc) make install-strip <br> ==== RISC-V 64bit (Newlibを使用する場合) ==== まず、[https://ftp.gnu.org/gnu/binutils/ GNUの公式Webサイト]から、Binutilsをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf binutils-<バージョン>.tar.xz cd binutils-<バージョン> <br> ビルドディレクトリを作成する。<br> mkdir build && cd build <br> クロスコンパイラ向けBinutilsのビルドおよびインストールする。<br> <u>インストールディレクトリは、クロスコンパイラ向けGCCのインストールディレクトリと同じディレクトリであることに注意する。</u><br> ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=riscv64-unknown-elf \ --disable-nls \ --disable-werror make -j $(nproc) make install <br> <u>次に、GCCの初期ビルドを行う。</u><br> [https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードして解凍する。<br> または、以下のコマンドを実行してダウンロードする。<br> wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-<バージョン>/gcc-<バージョン>.tar.xz tar xf gcc-<バージョン>.tar.xz cd gcc-<バージョン> <br> export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=riscv64-unknown-elf \ --enable-languages=c \ # まず、最小限のGCCコンパイラを生成する # このコンパイラはC言語のみをサポートし、標準ライブラリなしで動作可能 --disable-multilib \ --disable-nls \ --without-headers \ # ターゲットのシステムヘッダを使用せずにビルド --with-newlib # 組み込みシステム向けのC標準ライブラリNewlibを使用 # GCCの一部のみをビルドおよびインストール make all-gcc -j $(nproc) make install-gcc <br> Newlibを使用する場合、Newlibのソースコードが必要になる。<br> [https://sourceware.org/newlib/ Newlibの公式Webサイト]、または、[https://github.com/bminor/newlib/ NewlibのGithub]にアクセスして、Newlibのソースコードをダウンロードする。<br> もし、Newlibの公式Webサイトからファイルをダウンロードできない場合は、<code>wget</code>コマンド等を使用する、あるいは、Githubからダウンロードする。<br> wget ftp://sourceware.org/pub/newlib/newlib-<バージョン>.tar.gz <br> ダウンロードしたファイルを解凍する。<br> tar xf newlib-<バージョン>.tar.gz <br> Newlibとは、組み込みシステムやベアメタル環境向けの軽量なC標準ライブラリ実装である。<br> GCCと一緒に使用することにより、完全なクロスコンパイル環境を構築できる。<br> <br> Newlibを使用する理由は以下の通りである。<br> * 軽量 *: 組み込みシステムや制限のあるハードウェア向けに最適化されている。 * 移植性 *: 多くのアーキテクチャをサポートしている。 * カスタマイズ性 *: 特定のターゲット向けに容易にカスタマイズできる。 <br> mkdir build && cd build ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --target=riscv64-unknown-elf make -j $(nproc) make install <br> <u>GCCの最終ビルドを行う。</u><br> export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=riscv64-unknown-elf \ --enable-languages=c,c++ \ # 完全な機能を持つGCC (最終ビルド) を生成 --disable-multilib \ --disable-nls \ --without-headers \ # ターゲットのシステムヘッダを使用せずにビルド --with-newlib \ # 組み込みシステム向けのC標準ライブラリNewlibを使用 --with-sysroot=/<Newlibのインストールディレクトリ>/riscv64-unknown-elf # Newlibのヘッダファイルとライブラリの場所を指定 make all -j $(nproc) make install <br> ==== H8 (システムルート無し) ==== <u>※注意 1</u><br> <u>H8向けのGCCのターゲットには、<code>h8300-hms</code>(coffと同じ)と<code>h8300-elf</code>があり,バイナリフォーマットが異なることに注意する。</u><br> <br> <u>※注意 2</u><br> <u>GCC 9.1以降は、共有ライブラリとしてC++(libstdc++)をビルドすると失敗するため、C言語のみの対応となる。</u><br> <u>スタティックライブラリとしてはビルド可能であるが、その場合、例えば、<code>#inlcude <iostream></code>のインクルードができなくなる。</u><br> <br> <u>共有ライブラリとしてビルド不可の理由としては、ビット数を管理するソースコードファイルにおいて、</u><br> <u><code>std::size_t</code>の配列が、H8アーキテクチャ上では<code>std::size_t</code>のビット長が短いため、配列の要素が格納できないからである。</u><br> <u>また、C++17のメモリ管理機構において、コンパイル時の<code>static_assert</code>に失敗する。</u><br> <br> GCC 8.5では、GCCのMakefileに手を加えることにより、C言語およびC++言語を対応させることができる。<br> 通常、ビルドを行う場合、<code>basic_string.h</code>ファイルにおいて、<code>internal compiler error: unrecognizable insn</code>としてエラーになる。<br> これは、C++向けライブラリをビルドするためのxgccにおいて、内部エラーが起きているからである。<br> <u>しかし、ビルドディレクトリにあるh8300-elfディレクトリ内のMakefileファイルの526行目 <code>CXXFLAGS_FOR_TARGET</code>を<code>-g -O0</code>に変更する(最適化を無効にする)ことにより、ビルド可能となる。</u><br> <br> H8 GCCツールチェーンのビルドには32ビットGCCライブラリも必要であるため、以下に示すライブラリもインストールする。<br> sudo zypper install glibc-devel-32bit <br> まず、[https://ftp.gnu.org/gnu/binutils/ GNUの公式Webサイト]から、Binutilsをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf binutils-<バージョン>.tar.xz cd binutils-<バージョン> <br> クロスコンパイラ向けBinutilsのビルドおよびインストールする。<br> <u>インストールディレクトリは、クロスコンパイラ向けGCCのインストールディレクトリと同じディレクトリであることに注意する。</u><br> mkdir build && cd build ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=h8300-elf \ --disable-gdb \ --disable-nls \ --disable-multilib \ --disable-werror \ --enable-lto make -j $(nproc) make install <br> 次に、[https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf gcc-<バージョン>.tar.xz cd gcc-<バージョン> <br> さらに、[https://sourceware.org/newlib/ Newlibの公式Webサイト]、または、[https://github.com/bminor/newlib/ NewlibのGithub]にアクセスして、Newlibのソースコードをダウンロードする。<br> もし、Newlibの公式Webサイトからファイルをダウンロードできない場合は、<code>wget</code>コマンド等を使用してダウンロードする。<br> wget ftp://sourceware.org/pub/newlib/newlib-<バージョン>.tar.gz <br> <u>ただし、現在(2022年11月現在)、Newlibの公式Webサイトからダウンロードしたファイルを使用するとビルドに失敗するため、Githubからダウンロードすること。</u><br> <br> ダウンロードしたファイルを解凍する。<br> tar xf newlib-<バージョン>.tar.gz <br> クロスコンパイラ向けGCC(1度目は、gccファイルのみ)をビルドおよびインストールする。<br> クロスコンパイラ向けGCCをビルドする場合、ネイティブ向けGCCとバージョンを合わせた方がよい。<br> # GCC ビルド ステージ:1 cd <GCCのソースコードがあるディレクトリ> mkdir build && cd build # GCC 8.5以前 export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=h8300-elf \ --enable-languages=c,c++ \ --disable-bootstrap \ --disable-nls \ --disable-werror \ --enable-lto \ --enable-gold \ --with-newlib \ --with-headers=/<上記でダウンロードしたNewlibのディレクトリ>/newlib/libc/include make -j $(nproc) make install # GCC 9.1以降 export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=h8300-elf \ --enable-languages=c \ --disable-bootstrap \ --disable-nls \ --disable-shared \ --enable-static \ --disable-libstdc__-v3 \ --enable-lto \ --enable-gold \ --with-newlib \ --with-headers=/<上記でダウンロードしたNewlibのディレクトリ>/newlib/libc/include make -j $(nproc) make install <br> 次に、Newlibをビルドおよびインストールする。<br> mkdir build && cd build export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=h8300-elf make -j $(nproc) make install <br> 最後に、クロスコンパイラ向けGCC(2度目は、g++ファイルのみ)をビルドおよびインストールする。<br> # GCC ビルド ステージ:2 cd <GCCのソースコードがあるディレクトリ>/build # GCC 8.5以前は不要 # GCC 9.1以降 export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=h8300-elf \ --enable-languages=c,c++ \ --disable-bootstrap \ --disable-nls \ --disable-shared \ --enable-static \ --disable-libstdc__-v3 \ --enable-lto \ --enable-gold \ --with-newlib \ --with-headers=/<上記でダウンロードしたNewlibのディレクトリ>/newlib/libc/include make -j $(nproc) make install <br> ==== MinGW-w64 (Windows 64bit) ==== MinGW-w64を使用して、Linux上でWindows 64bit向けバイナリを生成するクロスコンパイラを構築する。<br> ターゲットトリプレットは <u>x86_64-w64-mingw32</u>、例外処理モデルは <u>SEH</u>、スレッドモデルは <u>POSIX</u> を使用する。<br> <br> まず、[https://sourceforge.net/projects/mingw-w64/files/ MinGW-w64のSourceForge]から、MinGW-w64のソースコードをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf mingw-w64-v<バージョン>.tar.bz2 <br> ===== Binutilsのインストール ===== [https://ftp.gnu.org/gnu/binutils/ GNUの公式Webサイト]から、Binutilsをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf binutils-<バージョン>.tar.xz cd binutils-<バージョン> <br> ビルドディレクトリを作成する。<br> mkdir build && cd build <br> クロスコンパイラ向けBinutilsのビルドおよびインストールする。<br> <u>インストールディレクトリは、クロスコンパイラ向けGCCのインストールディレクトリと同じディレクトリであることに注意する。</u><br> ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=x86_64-w64-mingw32 \ --disable-nls \ --disable-werror \ --disable-multilib \ --enable-lto \ --enable-gold \ --enable-plugins make -j $(nproc) make install <br> ===== MinGW-w64ヘッダのインストール ===== MinGW-w64のヘッダファイルをインストールする。<br> <code>--with-default-win32-winnt=0x0A00</code> オプションにより、Windows 10以降をターゲットとする。<br> <br> <center> {| class="wikitable" |+ _WINNT_WINxxマクロの値 ! Windowsバージョン !! _WIN32_WINNTバージョン定数 |- | Windows 2000 || 0x0500 |- | Windows XP || 0x0501 |- | Windows Server 2003 || 0x0502 |- | Windows Vista / Server 2008 || 0x0600 |- | Windows 7 / Server 2008 R2 || 0x0601 |- | Windows 8 / Server 2012 || 0x0602 |- | Windows 8.1 / Server 2012 R2 || 0x0603 |- | Windows 10 / Server 2016 || 0x0A00 |- | Windows 11 / Server 2022 || 0x0A00 |} </center> <br> cd /<MinGW-w64のソースコードがあるディレクトリ>/mingw-w64-headers mkdir build && cd build ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ>/x86_64-w64-mingw32 \ --build=x86_64-pc-linux-gnu \ --host=x86_64-w64-mingw32 \ --with-default-win32-winnt=0x0A00 make install <br> ターゲットディレクトリにシンボリックリンクを作成する。<br> ln -s /<クロスコンパイラ向けGCCのインストールディレクトリ>/x86_64-w64-mingw32 \ /<クロスコンパイラ向けGCCのインストールディレクトリ>/mingw <br> ===== GCCコアコンパイラ (最小限のGCCコンパイラ) のインストール ===== [https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードして解凍する。<br> または、以下のコマンドを実行してダウンロードする。<br> wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-<バージョン>/gcc-<バージョン>.tar.xz tar xf gcc-<バージョン>.tar.xz cd gcc-<バージョン> <br> まず、GCCコアコンパイラ (最小限のGCCコンパイラ) を生成する。<br> <u>このコンパイラは、CRT および winpthreads のビルドに使用する。</u><br> mkdir build && cd build export PATH="/<クロスコンパイラ向けGCCのインストールディレクトリ>/bin:$PATH" ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=x86_64-w64-mingw32 \ --enable-languages=c,c++ \ --disable-multilib \ --disable-nls \ --disable-shared \ --disable-werror \ --enable-lto make all-gcc -j $(nproc) make install-gcc <br> ===== MinGW-w64 CRTのインストール ===== MinGW-w64のCRT (Cランタイムライブラリ) をビルドおよびインストールする。<br> cd /<MinGW-w64のソースコードがあるディレクトリ>/mingw-w64-crt mkdir build && cd build export PATH="<クロスコンパイラ向けGCCのインストールディレクトリ>/bin:$PATH" ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ>/x86_64-w64-mingw32 \ --build=x86_64-pc-linux-gnu \ --host=x86_64-w64-mingw32 \ --with-sysroot=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --enable-lib64 \ --disable-lib32 make -j $(nproc) make install <br> ===== winpthreadsのインストール ===== POSIXスレッドサポートのためのwinpthreadsライブラリをビルドおよびインストールする。<br> cd /<MinGW-w64のソースコードがあるディレクトリ>/mingw-w64-libraries/winpthreads mkdir build && cd build export PATH="/<クロスコンパイラ向けGCCのインストールディレクトリ>/bin:$PATH" ../configure --prefix=/<クロスコンパイラ向けGCCのインストールディレクトリ>/x86_64-w64-mingw32 \ --build=x86_64-pc-linux-gnu \ --host=x86_64-w64-mingw32 \ --enable-static \ --enable-shared make -j $(nproc) make install <br> ===== GCCの最終インストール ===== 全てのライブラリをインストールした後、完全な機能を持つGCCをビルドおよびインストールする。<br> cd <GCCのソースコードがあるディレクトリ>/build # 初期ビルドのディレクトリを削除して再作成する場合 rm -rf * export PATH="<クロスコンパイラ向けGCCのインストールディレクトリ>/bin:$PATH" ../configure --prefix=/<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=x86_64-w64-mingw32 \ --enable-languages=c,c++ \ --disable-multilib \ --disable-nls \ --disable-werror \ --enable-shared \ --enable-threads=posix \ --enable-lto \ --with-dwarf2 make -j $(nproc) make install-strip <br> ==== MinGW-w64 (Windows 32bit) ==== MinGW-w64を使用して、Linux上でWindows 32bit向けバイナリを生成するクロスコンパイラを構築する。<br> ターゲットトリプレットは <u>i686-w64-mingw32</u>、例外処理モデルは <u>DWARF-2</u>、スレッドモデルは <u>POSIX</u> を使用する。<br> <br> まず、[https://sourceforge.net/projects/mingw-w64/files/ MinGW-w64のSourceForge]から、MinGW-w64のソースコードをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf mingw-w64-v<バージョン>.tar.bz2 <br> ===== Binutilsのインストール ===== [https://ftp.gnu.org/gnu/binutils/ GNUの公式Webサイト]から、Binutilsをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf binutils-<バージョン>.tar.xz cd binutils-<バージョン> <br> ビルドディレクトリを作成する。<br> mkdir build && cd build <br> クロスコンパイラ向けBinutilsをビルドおよびインストールする。<br> <u>インストールディレクトリは、クロスコンパイラ向けGCCのインストールディレクトリと同じディレクトリであることに注意する。</u><br> ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=i686-w64-mingw32 \ --disable-nls \ --disable-werror \ --disable-multilib \ --enable-lto \ --enable-gold \ --enable-plugins make -j $(nproc) make install <br> ===== MinGW-w64ヘッダのインストール ===== MinGW-w64のヘッダファイルをインストールする。<br> 以下の例では、<code>--with-default-win32-winnt=0x0A00</code> オプションにより、Windows 10以降をターゲットとしている。<br> <br> <center> {| class="wikitable" |+ _WINNT_WINxxマクロの値 ! Windowsバージョン !! _WIN32_WINNTバージョン定数 |- | Windows 2000 || 0x0500 |- | Windows XP || 0x0501 |- | Windows Server 2003 || 0x0502 |- | Windows Vista / Server 2008 || 0x0600 |- | Windows 7 / Server 2008 R2 || 0x0601 |- | Windows 8 / Server 2012 || 0x0602 |- | Windows 8.1 / Server 2012 R2 || 0x0603 |- | Windows 10 / Server 2016 || 0x0A00 |- | Windows 11 / Server 2022 || 0x0A00 |} </center> <br> cd /<MinGW-w64のソースコードがあるディレクトリ>/mingw-w64-headers mkdir build && cd build ../configure --prefix=/<クロスコンパイラ向けGCCのインストールディレクトリ>/i686-w64-mingw32 \ --build=x86_64-pc-linux-gnu \ --host=i686-w64-mingw32 \ --with-default-win32-winnt=0x0A00 make install <br> ターゲットディレクトリにシンボリックリンクを作成する。<br> ln -s /<クロスコンパイラ向けGCCのインストールディレクトリ>/i686-w64-mingw32 \ /<クロスコンパイラ向けGCCのインストールディレクトリ>/mingw <br> ===== GCCコアコンパイラ (最小限のGCCコンパイラ) のインストール ===== [https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードして解凍する。<br> または、以下に示すコマンドを実行してダウンロードする。<br> wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-<バージョン>/gcc-<バージョン>.tar.xz tar xf gcc-<バージョン>.tar.xz cd gcc-<バージョン> <br> まず、GCCコアコンパイラ (最小限のGCCコンパイラ) を生成する。<br> このコンパイラは、CRT および winpthreads のビルドに使用する。<br> mkdir build && cd build export PATH="/<クロスコンパイラ向けGCCのインストールディレクトリ>/bin:$PATH" ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=i686-w64-mingw32 \ --enable-languages=c,c++ \ --disable-multilib \ --disable-nls \ --disable-shared \ --disable-werror \ --enable-lto make all-gcc -j $(nproc) make install-gcc <br> ===== MinGW-w64 CRTのインストール ===== MinGW-w64のCRT (Cランタイムライブラリ) をビルドおよびインストールする。<br> cd /<MinGW-w64のソースコードがあるディレクトリ>/mingw-w64-crt mkdir build-32 && cd build-32 export PATH="/<クロスコンパイラ向けGCCのインストールディレクトリ>/bin:$PATH" ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ>/i686-w64-mingw32 \ --build=x86_64-pc-linux-gnu \ --host=i686-w64-mingw32 \ --with-sysroot=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --enable-lib32 \ --disable-lib64 make -j $(nproc) make install <br> ===== winpthreadsのインストール ===== POSIXスレッドサポートのためのwinpthreadsライブラリをビルドおよびインストールする。<br> cd /<MinGW-w64のソースコードがあるディレクトリ>/mingw-w64-libraries/winpthreads mkdir build-32 && cd build-32 export PATH="/<クロスコンパイラ向けGCCのインストールディレクトリ>/bin:$PATH" ../configure --prefix=/<クロスコンパイラ向けGCCのインストールディレクトリ>/i686-w64-mingw32 \ --build=x86_64-pc-linux-gnu \ --host=i686-w64-mingw32 \ --enable-static \ --enable-shared make -j $(nproc) make install <br> ===== GCCの最終インストール ===== 全てのライブラリが揃ったので、完全な機能を持つGCCをビルドおよびインストールする。<br> cd /<GCCのソースコードがあるディレクトリ>/build export PATH="<クロスコンパイラ向けGCCのインストールディレクトリ>/bin:$PATH" ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ --build=x86_64-pc-linux-gnu \ --host=x86_64-pc-linux-gnu \ --target=i686-w64-mingw32 \ --enable-languages=c,c++ \ --disable-multilib \ --disable-nls \ --disable-werror \ --enable-shared \ --enable-threads=posix \ --enable-lto \ --with-dwarf2 make -j $(nproc) make install-strip <br><br> == GCC ARMツールチェーンの使用方法 == ==== GCC ARMツールチェーンとは ==== Cortex-A向けGNUツールチェインは、C/C++、アセンブリ言語のためのオープンソースのツール群である。<br> これは、Cortex-Aファミリのプロセッサを対象としており、Arm Aプロファイルアーキテクチャを実装している。<br> このツールチェーンにはGCCが含まれており、WindowsおよびLinux向けに無償で提供されている。<br> <br> ==== GCC ARMツールチェーンのダウンロード ==== ===== Cortex-Aファミリ ===== [https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads ARMの公式Webサイト]から、ユーザの環境に合うバージョンをダウンロードする。<br> GCC ARMを解凍して、適切なディレクトリに配置する。<br> <br> ===== Raspberry Pi ===== Raspberry Pi向けにクロスコンパイルする場合は、下表を参考にして、ユーザの環境に合ったGCC ARMツールチェーンをダウンロードする。<br> https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/<br> <center> {| class="wikitable" style="background-color:#fefefe;" |+ 表. Raspberry Pi専用GCC ARMツールチェーンのダウンロード |- ! style="background-color:#66CCFF;" | Raspberry Piの種類 ! style="background-color:#66CCFF;" | Raspbian Stretch(32-bit) ! style="background-color:#66CCFF;" | Raspbian Buster(32-bit) ! style="background-color:#66CCFF;" | Raspbian Bullseye(32-bit) |- | Raspberry Pi Zero/W/WH<br>Raspberry Pi 1 Model A / B / A+ / B+ | style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%206.3.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-6.3.0-pi_0-1.tar.gz/download 6.3.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%209.3.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-9.3.0-pi_0-1.tar.gz/download 9.3.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%2010.2.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-10.2.0-pi_0-1.tar.gz/download 10.2.0] | style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%208.3.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-8.3.0-pi_0-1.tar.gz/download 8.3.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%209.3.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-9.3.0-pi_0-1.tar.gz/download 9.3.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%2010.2.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-10.2.0-pi_0-1.tar.gz/download 10.2.0] | style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Bullseye/GCC%2010.2.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-10.2.0-pi_0-1.tar.gz/download 10.2.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Bullseye/GCC%2010.3.0/Raspberry%20Pi%201%2C%20Zero/cross-gcc-10.3.0-pi_0-1.tar.gz/download 10.3.0] |- | Raspberry Pi 2 Model A / B<br>Raspberry Pi 3 Model A / B | style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%206.3.0/Raspberry%20Pi%202%2C%203/cross-gcc-6.3.0-pi_2-3.tar.gz/download 6.3.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%209.3.0/Raspberry%20Pi%202%2C%203/cross-gcc-9.3.0-pi_2-3.tar.gz/download 9.3.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%2010.2.0/Raspberry%20Pi%202%2C%203/cross-gcc-10.2.0-pi_2-3.tar.gz/download 10.2.0] | style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%208.3.0/Raspberry%20Pi%202%2C%203/cross-gcc-8.3.0-pi_2-3.tar.gz/download 8.3.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%209.3.0/Raspberry%20Pi%202%2C%203/cross-gcc-9.3.0-pi_2-3.tar.gz/download 9.3.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%2010.2.0/Raspberry%20Pi%202%2C%203/cross-gcc-10.2.0-pi_2-3.tar.gz/download 10.2.0] | style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Bullseye/GCC%2010.2.0/Raspberry%20Pi%202%2C%203/cross-gcc-10.2.0-pi_2-3.tar.gz/download 10.2.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Bullseye/GCC%2010.3.0/Raspberry%20Pi%202%2C%203/cross-gcc-10.3.0-pi_2-3.tar.gz/download 10.3.0] |- | Raspberry Pi 3 Model A+ / B+<br>Raspberry Pi 4 Model A+ / B+<br>Raspberry Pi Compute 3 / 3lite / 3+ | style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%206.3.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-6.3.0-pi_3%2B.tar.gz/download 6.3.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%209.3.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-9.3.0-pi_3%2B.tar.gz/download 8.3.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Stretch/GCC%2010.2.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-10.2.0-pi_3%2B.tar.gz/download 10.2.0] | style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%208.3.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-8.3.0-pi_3%2B.tar.gz/download 8.3.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%209.3.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-9.3.0-pi_3%2B.tar.gz/download 9.3.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Buster/GCC%2010.2.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-10.2.0-pi_3%2B.tar.gz/download 10.2.0] | style="text-align:center;" | [https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Bullseye/GCC%2010.2.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-10.2.0-pi_3%2B.tar.gz/download 10.2.0]<br>[https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Raspberry%20Pi%20GCC%20Cross-Compiler%20Toolchains/Bullseye/GCC%2010.3.0/Raspberry%20Pi%203A%2B%2C%203B%2B%2C%204/cross-gcc-10.3.0-pi_3%2B.tar.gz/download 10.3.0] |} </center> <br> 上表は、Raspbian OS 32bit向けのGCC ARMツールチェインであるが、Raspbian OS 64bit向けのGCC ARMツールチェインが必要な場合は、以下に示すURLにアクセスする。<br> https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Bonus%20Raspberry%20Pi%20GCC%2064-Bit%20Toolchains/Raspberry%20Pi%20GCC%2064-Bit%20Cross-Compiler%20Toolchains/<br> <br> また、Raspberry Pi向けには、Linaro社が提供しているGCC ARMツールチェインを使用することもできる。<br> * GCCツールチェーン群 *: https://snapshots.linaro.org/gnu-toolchain/ * GCC 10.2 (Bullseye 32ビット向け) *: https://snapshots.linaro.org/components/toolchain/binaries/10.2-2021.01-3/arm-linux-gnueabihf/ * GCC 10.2 (Bullseye 64ビット向け) *: https://snapshots.linaro.org/components/toolchain/binaries/10.2-2021.01-3/aarch64-linux-gnu/ <br> <u>※注意</u><br> <u>クロスコンパイラのlibstdc++.so.6ファイルにおいて、Raspberry Pi OSのlibstdc++.so.6ファイルのバージョンと同等または古いものを使用する必要がある。</u><br> <u>例えば、Raspberry Pi OS Bullseyeのlibstdc++.so.6ファイルはGLIBCXX_3.4.28までであるため、GCC 10ツールチェーン、または、それ以前のものを使用する。</u><br> <u>また、Raspberry Pi OS Bookwormのlibstdc++.so.6ファイルはGLIBCXX_3.4.30までであるため、GCC 12ツールチェーン、または、それ以前のものを使用する。</u><br> <br> ==== GCC ARMツールチェーンを使用したコンパイル ==== ===== Cortex-Aファミリ ===== 以下の例では、ARMの公式WebサイトからダウンロードしたGCC ARMツールチェーンを使用して、<br> 任意のソフトウェアをCortex-Aファミリ向けにビルドしている。<br> <br> もし、configureスクリプトを実行する時、<u>undefined reference to 'rpl_malloc'</u>というエラーが表示される場合は、<br> <code>ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes</code>オプションを付加する。<br> これは、autotoolsの仕様で、GLIBC以外のシステム(例. uClibc等)を使用しているからである。<br> # 32bit Cortex-A (Hard Float) 向けにビルドする場合 ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes \ ../configure --prefix=<ソフトウェアのインストールディレクトリ> \ CC=/<GCC_ARMのインストールディレクトリ>/bin/arm-none-linux-gnueabihf-gcc \ CXX=/<GCC_ARMのインストールディレクトリ>/bin/arm-none-linux-gnueabihf-g++ \ --build=x86_64-unknown-linux-gnu \ --host=arm-none-linux-gnueabihf \ --target=arm-none-linux-gnueabihf \ --with-sysroot=/<GCC_ARMのインストールディレクトリ>/arm-none-linux-gnueabihf/libc \ --with-gnu-ld make -j $(nproc) LDFLAGS="-L/<GCC_ARMのインストールディレクトリ>/arm-none-linux-gnueabihf/lib" \ CFLAGS="-I/<GCC_ARMのインストールディレクトリ>/arm-none-linux-gnueabihf/include" make install <br> # 64bit Cortex-A向けにビルドする場合 ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes \ ../configure --prefix=<ソフトウェアのインストールディレクトリ> \ CC=/<GCC_ARMのインストールディレクトリ>/bin/aarch64-none-linux-gnu-gcc \ CXX=/<GCC_ARMのインストールディレクトリ>/bin/aarch64-none-linux-gnu-g++ \ --build=x86_64-unknown-linux-gnu \ --host=aarch64-none-linux-gnu \ --target=aarch64-none-linux-gnu \ --with-sysroot=/<GCC_ARMのインストールディレクトリ>/aarch64-none-linux-gnu/libc \ --with-gnu-ld make -j $(nproc) LDFLAGS="-L/<GCC_ARMのインストールディレクトリ>/aarch64-none-linux-gnu/lib64" \ CFLAGS="-I/<GCC_ARMのインストールディレクトリ>/aarch64-none-linux-gnu/include" make install <br> ===== Raspberry Pi ===== 以下の例では、SourceForgeからダウンロードした<u>Raspberry Pi専用のGCC ARMツールチェーン</u>を使用して、<br> 任意のソフトウェアをRaspberry Pi向けにビルドしている。<br> # Raspberry Pi OS 32ビットの場合 ac_cv_func_malloc_0_nonnull=yes \ ac_cv_func_realloc_0_nonnull=yes \ ../configure --prefix=<ソフトウェアのインストールディレクトリ> \ CC=/<GCC_ARMのインストールディレクトリ>/bin/arm-linux-gnueabihf-gcc \ CXX=/<GCC_ARMのインストールディレクトリ>/bin/arm-linux-gnueabihf-g++ \ --build=x86_64-unknown-linux-gnu \ --host=arm-linux-gnueabihf \ --target=arm-linux-gnueabihf make -j $(nproc) make install <br> # Raspberry Pi OS 64ビットの場合 ../configure --prefix=<ソフトウェアのインストールディレクトリ> \ CC=/<GCC_ARMのインストールディレクトリ>/bin/aarch64-linux-gnu-gcc \ CXX=/<GCC_ARMのインストールディレクトリ>/bin/aarch64-linux-gnu-g++ \ --build=x86_64-unknown-linux-gnu \ --host=aarch64-linux-gnu \ --target=aarch64-linux-gnu make -j $(nproc) make install <br><br> == PIE(Position Independent Executable)== PIEは、実行時にメモリ上の任意のアドレスに配置できる実行可能ファイルの形式である。<br> <br> ==== PIEの概念 ==== 通常の実行ファイルは、コンパイル時に固定されたメモリアドレスを前提として生成される。<br> 例えば、プログラムのコードセクションは常に 0x400000 番地から始まる、といった具合である。<br> <br> 一方、PIEでコンパイルされた実行ファイルは、相対アドレス指定を使用するため、メモリ上のどこに配置されても正常に動作する。<br> プログラム内の関数呼び出しやデータアクセスは、絶対アドレスではなく、現在位置からの相対的なオフセットで計算される。<br> <br> PIEのメリットは、ASLR (Address Space Layout Randomization) と組み合わせることにより、強力なセキュリティ対策になることである。<br> <br> ASLRは、プログラム実行時にコードやデータをメモリ上のランダムな位置に配置する技術である。<br> PIEでない実行ファイルは固定アドレスに配置されるため、攻撃者が脆弱性を悪用する際にジャンプ先のアドレスを予測しやすくなる。<br> PIEを使用することにより、実行するたびにプログラムの配置位置が変わるため、バッファオーバーフロー や ROP (Return-Oriented Programming) 攻撃等が困難になる。<br> <br> PIEは実行ファイル向けの技術であるが、似た概念として共有ライブラリ向けのPIC (Position Independent Code) がある。<br> <br> デフォルトでPIEが有効になっていないGCCでPIEを使用する場合は、コンパイル時とリンク時の両方でオプションを指定する。<br> # コンパイル時 gcc -fPIE -c program.c # リンク時 gcc -pie -o program program.o <br> Ubuntu 17.10以降、Debian 9以降、Fedora 23以降等、多くのLinuxディストリビューションでは、PIEがデフォルトで有効になっている。<br> <br><br> == C++14 / C++17のサンプルコード == C++14では、ラムダ式のパラメータのタイプにautoが使用できる。<br> <syntaxhighlight lang="c++"> // sample.cpp #include <iostream> int main() { std::cout << [](auto a, auto b) { return a + b; } (5, 6) << std::endl; std::cout << [](auto a, auto b) { return a + b; } (5.23, 6.45) << std::endl; return 0; } </syntaxhighlight> <br> # 実行 g++-10.1 -Wall -pedantic sample.cpp -o sample ./sample # 出力 11 11.68 <br> このページの冒頭で述べたように、GCC 10.1は、C++17を完全にサポートしている。<br> 以下の例では、static_assertへのC++17変更の使用例をテストしている。<br> <syntaxhighlight lang="c++"> // sample.cpp #include <type_traits> #include <iostream> struct A { int foo; }; struct B { int foo = 0; }; template <typename T> void print(const T& a) { static_assert(std::is_pod<T>::value); std::cout << a.foo << '\n'; } int main() { A x{1}; B y{2}; B z; print<A>(x); print<B>(y); print<B>(z); return 0; } </syntaxhighlight> <br> コンパイルを行うには、-std=c++17オプションを付与する。<br> また、上記のコードの17行目と24行目でトリガーされたコンパイルエラーが表示される。<br> # 実行 g++-10.1 -std=c++17 -Wall -pedantic sample.cpp -o sample # 出力 sample.cpp: In instantiation of ‘void print(const T&) [with T = B]’: sample.cpp:24:13: required from here sample.cpp:14:33: error: static assertion failed 17 | static_assert(std::is_pod<T>::value); <br> もし、C++11の構文の詳細に興味がある場合は、Bjarne StroustrupによるC++プログラミング言語を読むことを推奨する。<br> <br><br> __FORCETOC__ [[カテゴリ:RHEL]][[カテゴリ:SUSE]]
インストール - GCC
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse