📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の52版が非表示) | |||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
RHELおよびSUSEのパッケージ管理システムで提供されているGCCのバージョンは古い可能性がある。<br> | |||
最新のGCCでは、C++11からC++17を完全にサポートしており、また、C++ | 最新のGCCでは、C++11からC++17を完全にサポートしており、また、C++20をサポートしている。<br> | ||
<br> | |||
また、最新のGCCでは、C11およびC++14のサポートがデフォルトで有効になっている。(-std=c11または-std=c++14を追加する必要はない)<br> | また、最新のGCCでは、C11およびC++14のサポートがデフォルトで有効になっている。(-std=c11または-std=c++14を追加する必要はない)<br> | ||
<br><br> | <br><br> | ||
== 依存関係のライブラリのインストール == | == GCCのインストール : ソースコードからインストール == | ||
==== 依存関係のライブラリのインストール ==== | |||
まず、システムが最新であることを確認する。<br> | まず、システムが最新であることを確認する。<br> | ||
# | # RHEL | ||
sudo | sudo dnf update | ||
# SUSE | # SUSE | ||
| 14行目: | 16行目: | ||
<br> | <br> | ||
依存関係のライブラリを、以下に示す2種類のいずれかの方法でインストールする。<br> | 依存関係のライブラリを、以下に示す2種類のいずれかの方法でインストールする。<br> | ||
==== パッケージ管理システムの使用 ==== | <br> | ||
# | ===== パッケージ管理システムの使用 ===== | ||
sudo | # RHEL | ||
sudo dnf install gmp-devel mpfr-devel libmpc-devel isl-devel | |||
# SUSE | # SUSE | ||
| 23行目: | 26行目: | ||
gmp-devel mpfr-devel mpc-devel isl-devel | gmp-devel mpfr-devel mpc-devel isl-devel | ||
<br> | <br> | ||
===== スクリプトの使用 ===== | |||
==== | [https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードする。<br> | ||
[https://gcc.gnu.org GCCの公式Webサイト] | ダウンロードしたファイルを解凍する。<br> | ||
tar xf gcc-<バージョン>.tar.gz | |||
cd gcc-<バージョン> | |||
<br> | <br> | ||
ビルドに必要なライブラリをソースコードからビルドする場合、解凍したGCCのディレクトリに移動して、ライブラリをダウンロードする。<br> | |||
./contrib/download_prerequisites | ./contrib/download_prerequisites | ||
<br> | <br> | ||
ダウンロードされた依存関係のライブラリを解凍する。<br> | ダウンロードされた依存関係のライブラリを解凍する。<br> | ||
tar | tar xf gmp-<バージョン>.tar.bz2 | ||
tar | tar xf mpfr-<バージョン>.tar.bz2 | ||
tar | tar xf mpc-<バージョン>.tar.gz | ||
tar | tar xf isl-<バージョン>.tar.bz2 | ||
<br> | <br> | ||
ビルドに必要なライブラリを、ビルドしてインストールする。<br> | |||
* | * GMPのインストール | ||
./gmp- | ./gmp-<バージョン>/configure --prefix=<GCCのインストールディレクトリ> --enable-cxx | ||
make -j | make -j $(nproc) | ||
make check | make check | ||
make install | make install | ||
<br> | <br> | ||
* | * MPFRのインストール | ||
./mpfr- | ./mpfr-<バージョン>/configure --prefix=<GCCのインストールディレクトリ> --with-gmp=<GCCのインストールディレクトリ> | ||
make -s -j | make -s -j $(nproc) | ||
make -s check | make -s check -j $(nproc) | ||
make install | make install | ||
<br> | <br> | ||
* | * MPCのインストール | ||
./mpc- | ./mpc-<バージョン>/configure --prefix=<GCCのインストールディレクトリ> --with-gmp=<GCCのインストールディレクトリ> --with-mpfr=<GCCのインストールディレクトリ> | ||
make -s -j | make -s -j $(nproc) | ||
make check -s -j | make check -s -j $(nproc) | ||
make install | make install | ||
<br> | <br> | ||
* | * ISLのインストール | ||
./isl- | ./isl-<バージョン>/configure --prefix=<GCCのインストールディレクトリ> --with-gmp-prefix=<GCCのインストールディレクトリ> | ||
make -j | make -j $(nproc) | ||
make check | make check | ||
make install | make install | ||
<br> | |||
==== GCCのインストール ==== | |||
== GCCのインストール == | [https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードする。<br> | ||
[https://gcc.gnu.org GCCの公式Webサイト] | ダウンロードしたファイルを解凍する。<br> | ||
tar xf gcc-<バージョン>.tar.xz | tar xf gcc-<バージョン>.tar.xz | ||
cd gcc-<バージョン> | |||
<br> | <br> | ||
sha512.sumファイルを使用して、ダウンロードしたファイルのチェックを行う。<br> | sha512.sumファイルを使用して、ダウンロードしたファイルのチェックを行う。<br> | ||
| 79行目: | 78行目: | ||
<br> | <br> | ||
GCC 7.1をインストールする場合、/<GCC 7.1のソースディレクトリ>/libgcc/config/i386/linux-unwind.hファイルを、以下に示すように修正する必要がある。<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 *uc_ = context->cfa; | ||
// 修正後 | |||
struct ucontext_t *uc_ = context->cfa; | struct ucontext_t *uc_ = context->cfa; | ||
</syntaxhighlight> | |||
<br> | <br> | ||
GCCをビルドおよびインストールする。<br> | GCCをビルドおよびインストールする。<br> | ||
| 100行目: | 101行目: | ||
<br> | <br> | ||
# GCC 7.5以降かつパッケージ管理システムで依存関係のライブラリをインストールしている場合 | # GCC 7.5以降かつパッケージ管理システムで依存関係のライブラリをインストールしている場合 | ||
../configure -v --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu \ | ../configure -v --build=x86_64-linux-gnu \ | ||
--prefix=<GCCのインストールディレクトリ> --program-suffix="_X_X" \ | --host=x86_64-linux-gnu \ | ||
--enable-languages=c,c++,fortran --disable-bootstrap | --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 -j $(nproc) | ||
make install-strip | make install-strip | ||
# GCC 7.5以降かつ手動で依存関係のライブラリをインストールしている場合 | # GCC 7.5以降かつ手動で依存関係のライブラリをインストールしている場合 | ||
../configure -v --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu \ | ../configure -v --build=x86_64-linux-gnu \ | ||
--prefix=<GCCのインストールディレクトリ> --program-suffix="_X_X" \ | --host=x86_64-linux-gnu \ | ||
--enable-checking=release --enable-languages=c,c++,fortran --disable-bootstrap \ | --target=x86_64-linux-gnu \ | ||
--with-gmp=<GMP, MPC MPFR, ISLのインストールディレクトリ> --with-mpc=<GMP, MPC MPFR, ISLのインストールディレクトリ> \ | --prefix=<GCCのインストールディレクトリ> \ | ||
--with-mpfr=<GMP, MPC MPFR, ISLのインストールディレクトリ> --with-isl=<GMP, MPC MPFR, ISLのインストールディレクトリ> | --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 | 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 | make install | ||
# GCC 6.5以前かつパッケージ管理システムで依存関係のライブラリをインストールしている場合 | # GCC 6.5以前かつパッケージ管理システムで依存関係のライブラリをインストールしている場合 | ||
../configure -v --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu \ | ../configure -v --build=x86_64-linux-gnu \ | ||
--prefix=<GCCのインストールディレクトリ> --program-suffix="_X_X" \ | --host=x86_64-linux-gnu \ | ||
--enable-checking=release --enable-languages=c,c++,fortran --disable-bootstrap \ | --target=x86_64-linux-gnu \ | ||
--disable-libsanitizer --disable-libcilkrts | --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 -j $(nproc) | ||
make install-strip | make install-strip | ||
<br> | <br> | ||
~/.profileファイル等に環境変数を設定する。<br> | |||
vi ~/.profile | vi ~/.profile | ||
<br> | |||
<syntaxhighlight lang="sh"> | |||
# ~/.profileファイル | |||
export export PATH="/<GCCのインストールディレクトリ>/bin:$PATH" | export export PATH="/<GCCのインストールディレクトリ>/bin:$PATH" | ||
export LD_LIBRARY_PATH="/<GCCのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH" | export LD_LIBRARY_PATH="/<GCCのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH" | ||
</syntaxhighlight> | |||
<br> | <br> | ||
最後に、PCを再起動する。<br> | 最後に、PCを再起動する。<br> | ||
<br> | <br> | ||
==== GCCの設定 ==== | |||
* /etc/ld.so. | GCCをソースコードからインストールした場合、共有ライブラリが <u>/<GCCのインストールディレクトリ>/lib64</u> ディレクトリ内に生成されるが、環境変数が設定されていない。<br> | ||
* ~/. | そのため、以下に示すいずれかの方法で環境変数のパスを通す必要がある。<br> | ||
<br> | |||
* システム全体に設定する場合 | |||
*: /etc/ld.so.confファイル | |||
* ユーザごとに設定する場合 | |||
*: ~/.profileファイル等 | |||
*: 環境変数 <code>LD_LIBRARY_PATH</code> を設定する。 | |||
<br> | <br> | ||
==== | ===== システム全体に設定する場合 ===== | ||
/etc/ld.so.confファイルに< | /etc/ld.so.confファイルに <u>/<GCCのインストールディレクトリ/lib64</u> を追記することで、システム全体がライブラリを認識する。<br> | ||
sudo vi /etc/ld.so.conf | sudo vi /etc/ld.so.conf | ||
<br> | |||
# /etc/ld.so.confファイル | |||
/<GCCのインストールディレクトリ/lib64 | /<GCCのインストールディレクトリ/lib64 | ||
<br> | <br> | ||
設定を反映させる。<br> | |||
ldconfig -v | ldconfig -v | ||
<br> | <br> | ||
<code>ldconfig</code>コマンドを実行した時に表示される情報から、<br> | <code>ldconfig</code> コマンドを実行した時に表示される情報から、<br> | ||
以下に示すように、<u>/<GCCのインストールディレクトリ/lib64</u> ディレクトリが読み込まれていることを確認する。<br> | |||
/<GCCのインストールディレクトリ>/lib64: | /<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. | ldconfig: /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py is not an ELF file - it has the wrong magic bytes at the start. | ||
| 171行目: | 192行目: | ||
libmpxwrappers.so.2 -> libmpxwrappers.so.2.0.1 | libmpxwrappers.so.2 -> libmpxwrappers.so.2.0.1 | ||
<br> | <br> | ||
<code>ldconfig</code> | <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. | 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> | <br> | ||
これは、libstdc++.so.6.0.25-gdb. | これは、libstdc++.so.6.0.25-gdb.pyはpythonのスクリプトであるが、これを共有ライブラリとして認識していることが原因である。<br> | ||
file /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py | file /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py | ||
| 180行目: | 201行目: | ||
<br> | <br> | ||
対処方法としては、該当ファイルの名前を変更して、共有ライブラリと認識されないようする。<br> | 対処方法としては、該当ファイルの名前を変更して、共有ライブラリと認識されないようする。<br> | ||
mv /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py_org | mv /<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py \ | ||
/<GCCのインストールディレクトリ>/lib64/libstdc++.so.6.0.25-gdb.py_org | |||
<br> | <br> | ||
再度、<code>ldconfig</code>コマンドを実行する。<br> | 再度、<code>ldconfig</code> コマンドを実行する。<br> | ||
ldconfig -v | ldconfig -v | ||
<br> | <br> | ||
また、RHELおよびSUSEの場合、/etc/ld.so.confファイルに <u>include ld.so.conf.d/*.conf</u> と設定されている。<br> | |||
これは、ld.so.conf. | これは、ld.so.conf.dディレクトリ内のconf拡張子をもつファイルの内容を読み込むという意味である。<br> | ||
<br> | |||
システム全体に共有ライブラリのパスを設定するには、/etc/ld.so.conf.dディレクトリ内に該当するライブラリが存在するパスを記述した設定ファイルを作成する。<br> | |||
<br> | <br> | ||
ld.so.conf. | 以下の例では、/etc/ld.so.conf.d/00-libstdc++.confファイルを作成している。<br> | ||
sudo vi /etc/ld.so.conf.d/00-libstdc++.conf | |||
<br> | <br> | ||
# 00-libstdc++.confファイル | |||
/<GCCのインストールディレクトリ>/lib64 | /<GCCのインストールディレクトリ>/lib64 | ||
<br> | <br> | ||
設定を反映させる。<br> | |||
ldconfig -v | ldconfig -v | ||
<br> | <br> | ||
==== | ===== 各ユーザごとに設定する場合 ===== | ||
この方法は、ユーザごとに設定する必要がある。<br> | この方法は、ユーザごとに設定する必要がある。<br> | ||
~/. | <br> | ||
~/.profileファイル等に環境変数<code>LD_LIBRARY_PATH</code>を設定することにより、ユーザがログインする際に設定が読み込まれる。<br> | |||
vi ~/.profile | vi ~/.profile | ||
<br> | |||
<syntaxhighlight lang="sh"> | |||
# ~/.profileファイル | |||
export LD_LIBRARY_PATH="/<GCCのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH" | |||
export LD_LIBRARY_PATH= | </syntaxhighlight> | ||
<br> | <br> | ||
上記の設定を反映させるため、PCを再起動または再ログインする。<br> | 上記の設定を反映させるため、PCを再起動または再ログインする。<br> | ||
<br> | |||
==== libstdc++を入れ替える場合 ==== | |||
== libstdc++ | <u>この手順を行う場合、システムが不安定になる可能性があることに注意する。</u><br> | ||
<br> | <br> | ||
現在のlibstdc++の対応関係を確認する。<br> | 現在のlibstdc++の対応関係を確認する。<br> | ||
| 239行目: | 264行目: | ||
これは、各アーキテクチャのプロセッサを対象として実装している。<br> | これは、各アーキテクチャのプロセッサを対象として実装している。<br> | ||
<br> | <br> | ||
==== AArch64 (システムルートあり) ==== | ==== 共通 (ホスト側) ==== | ||
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> | まず、[https://ftp.gnu.org/gnu/binutils/ GNUの公式Webサイト]から、Binutilsをダウンロードする。<br> | ||
ダウンロードしたファイルを解凍する。<br> | ダウンロードしたファイルを解凍する。<br> | ||
| 250行目: | 279行目: | ||
クロスコンパイラ向けBinutilsのビルドおよびインストールする。<br> | クロスコンパイラ向けBinutilsのビルドおよびインストールする。<br> | ||
<u>インストールディレクトリは、クロスコンパイラ向けGCCのインストールディレクトリと同じディレクトリであることに注意する。</u><br> | <u>インストールディレクトリは、クロスコンパイラ向けGCCのインストールディレクトリと同じディレクトリであることに注意する。</u><br> | ||
../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ | ../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 -j $(nproc) | ||
| 270行目: | 307行目: | ||
クロスコンパイラ向けGCCをビルドする場合、ネイティブ向けGCCとバージョンを合わせた方がよい。<br> | クロスコンパイラ向けGCCをビルドする場合、ネイティブ向けGCCとバージョンを合わせた方がよい。<br> | ||
export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ | export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ | ||
CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ | CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ | ||
../configure -v --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> | ../configure -v \ | ||
CFLAGS="-g0 -O3 -fstack-protector-strong" \ | |||
CXXFLAGS="-g0 -O3 -fstack-protector-strong" \ | |||
--with-sysroot=<ターゲットのシステムルートディレクトリ> \ | --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 -j $(nproc) | ||
make install-strip | make install-strip | ||
<br> | <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 (システムルート無し) ==== | ==== H8 (システムルート無し) ==== | ||
<u>※注意</u><br> | <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>GCC 9.1以降は、共有ライブラリとしてC++(libstdc++)をビルドすると失敗するため、C言語のみの対応となる。</u><br> | ||
<u>スタティックライブラリとしてはビルド可能であるが、その場合、例えば、<code>#inlcude <iostream></code>のインクルードができなくなる。</u><br> | <u>スタティックライブラリとしてはビルド可能であるが、その場合、例えば、<code>#inlcude <iostream></code>のインクルードができなくなる。</u><br> | ||
| 294行目: | 626行目: | ||
これは、C++向けライブラリをビルドするためのxgccにおいて、内部エラーが起きているからである。<br> | これは、C++向けライブラリをビルドするためのxgccにおいて、内部エラーが起きているからである。<br> | ||
<u>しかし、ビルドディレクトリにあるh8300-elfディレクトリ内のMakefileファイルの526行目 <code>CXXFLAGS_FOR_TARGET</code>を<code>-g -O0</code>に変更する(最適化を無効にする)ことにより、ビルド可能となる。</u><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> | <br> | ||
まず、[https://ftp.gnu.org/gnu/binutils/ GNUの公式Webサイト]から、Binutilsをダウンロードする。<br> | まず、[https://ftp.gnu.org/gnu/binutils/ GNUの公式Webサイト]から、Binutilsをダウンロードする。<br> | ||
| 305行目: | 640行目: | ||
../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ | ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ | ||
--build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=h8300-elf \ | --build=x86_64-pc-linux-gnu \ | ||
--disable-gdb --disable-nls --disable-multilib --disable-werror \ | --host=x86_64-pc-linux-gnu \ | ||
--target=h8300-elf \ | |||
--disable-gdb \ | |||
--disable-nls \ | |||
--disable-multilib \ | |||
--disable-werror \ | |||
--enable-lto | --enable-lto | ||
make -j $(nproc) | make -j $(nproc) | ||
| 316行目: | 656行目: | ||
cd gcc-<バージョン> | cd gcc-<バージョン> | ||
<br> | <br> | ||
さらに、[https://sourceware.org/newlib/ | さらに、[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 | wget ftp://sourceware.org/pub/newlib/newlib-<バージョン>.tar.gz | ||
<br> | <br> | ||
<u>ただし、現在(2022年11月現在) | <u>ただし、現在(2022年11月現在)、Newlibの公式Webサイトからダウンロードしたファイルを使用するとビルドに失敗するため、Githubからダウンロードすること。</u><br> | ||
<br> | <br> | ||
ダウンロードしたファイルを解凍する。<br> | ダウンロードしたファイルを解凍する。<br> | ||
| 331行目: | 671行目: | ||
mkdir build && cd build | mkdir build && cd build | ||
# GCC 8.5以前 | |||
export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ | export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ | ||
CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ | CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ | ||
../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ | ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ | ||
--build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=h8300-elf \ | --build=x86_64-pc-linux-gnu \ | ||
--enable-languages=c \ | --host=x86_64-pc-linux-gnu \ | ||
--disable-bootstrap --disable-nls --disable-shared --enable-static --enable-lto --enable-gold \ | --target=h8300-elf \ | ||
--with-newlib \ | --enable-languages=c,c++ \ | ||
--with-headers=/< | --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 -j $(nproc) | ||
make install | make install | ||
<br> | <br> | ||
次に、Newlibをビルドおよびインストールする。<br> | |||
mkdir build && cd build | mkdir build && cd build | ||
export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ | export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ | ||
CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ | CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ | ||
../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ | ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ | ||
--build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=h8300-elf | --build=x86_64-pc-linux-gnu \ | ||
--host=x86_64-pc-linux-gnu \ | |||
--target=h8300-elf | |||
make -j $(nproc) | make -j $(nproc) | ||
make install | make install | ||
| 357行目: | 726行目: | ||
cd <GCCのソースコードがあるディレクトリ>/build | cd <GCCのソースコードがあるディレクトリ>/build | ||
# GCC 8.5以前は不要 | |||
# GCC 9.1以降 | |||
export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ | export PATH="/<上記でインストールしたBinutilsのインストールディレクトリ>/bin:$PATH" && \ | ||
CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ | CC=<ネイティブ向けGCCのパス> CXX=<ネイティブ向けG++のパス> \ | ||
../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ | ../configure --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \ | ||
--build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=h8300-elf \ | --build=x86_64-pc-linux-gnu \ | ||
--enable-languages=c,c++ \ | --host=x86_64-pc-linux-gnu \ | ||
--disable-bootstrap --disable-nls --disable-shared --enable-static --disable-libstdc__-v3 --enable-lto --enable-gold \ | --target=h8300-elf \ | ||
--with-newlib \ | --enable-languages=c,c++ \ | ||
--with-headers=/< | --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 -j $(nproc) | ||
make install | 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> | <br><br> | ||
| 414行目: | 1,112行目: | ||
<br> | <br> | ||
また、Raspberry Pi向けには、Linaro社が提供しているGCC ARMツールチェインを使用することもできる。<br> | また、Raspberry Pi向けには、Linaro社が提供しているGCC ARMツールチェインを使用することもできる。<br> | ||
https:// | * 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> | <br> | ||
| 429行目: | 1,133行目: | ||
<code>ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes</code>オプションを付加する。<br> | <code>ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes</code>オプションを付加する。<br> | ||
これは、autotoolsの仕様で、GLIBC以外のシステム(例. uClibc等)を使用しているからである。<br> | これは、autotoolsの仕様で、GLIBC以外のシステム(例. uClibc等)を使用しているからである。<br> | ||
# 32bit Cortex-A(Hard | # 32bit Cortex-A (Hard Float) 向けにビルドする場合 | ||
ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes \ | ac_cv_func_malloc_0_nonnull=yes \ | ||
../configure --prefix=<ソフトウェアのインストールディレクトリ> \ | 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" \ | make -j $(nproc) LDFLAGS="-L/<GCC_ARMのインストールディレクトリ>/arm-none-linux-gnueabihf/lib" \ | ||
CFLAGS="-I/<GCC_ARMのインストールディレクトリ>/arm-none-linux-gnueabihf/include" | |||
make install | make install | ||
<br> | <br> | ||
# 64bit Cortex-A向けにビルドする場合 | # 64bit Cortex-A向けにビルドする場合 | ||
ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes \ | ac_cv_func_malloc_0_nonnull=yes \ | ||
../configure --prefix=<ソフトウェアのインストールディレクトリ> \ | 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" \ | make -j $(nproc) LDFLAGS="-L/<GCC_ARMのインストールディレクトリ>/aarch64-none-linux-gnu/lib64" \ | ||
CFLAGS="-I/<GCC_ARMのインストールディレクトリ>/aarch64-none-linux-gnu/include" | |||
make install | make install | ||
<br> | <br> | ||
| 458行目: | 1,168行目: | ||
以下の例では、SourceForgeからダウンロードした<u>Raspberry Pi専用のGCC ARMツールチェーン</u>を使用して、<br> | 以下の例では、SourceForgeからダウンロードした<u>Raspberry Pi専用のGCC ARMツールチェーン</u>を使用して、<br> | ||
任意のソフトウェアをRaspberry Pi向けにビルドしている。<br> | 任意のソフトウェアをRaspberry Pi向けにビルドしている。<br> | ||
ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes \ | # Raspberry Pi OS 32ビットの場合 | ||
../configure --prefix=<ソフトウェアのインストールディレクトリ> \ | 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 -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 | 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> | <br><br> | ||
| 545行目: | 1,298行目: | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ: | [[カテゴリ:RHEL]][[カテゴリ:SUSE]] | ||