📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の53版が非表示)
1行目: 1行目:
== 概要 ==
== 概要 ==
CentOSやSUSEのパッケージ管理システムで提供されているGCCのバージョンは古い可能性がある。<br>
RHELおよびSUSEのパッケージ管理システムで提供されているGCCのバージョンは古い可能性がある。<br>
最新のGCCでは、C++11からC++17を完全にサポートしており、また、C++20を部分的にサポートしている。<br>
最新の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>
  # CentOS
  # RHEL
  sudo yum update
  sudo dnf update
   
   
  # SUSE
  # SUSE
14行目: 16行目:
<br>
<br>
依存関係のライブラリを、以下に示す2種類のいずれかの方法でインストールする。<br>
依存関係のライブラリを、以下に示す2種類のいずれかの方法でインストールする。<br>
==== パッケージ管理システムの使用 ====
<br>
  # CentOS
===== パッケージ管理システムの使用 =====
  sudo yum install gmp-devel mpfr-devel libmpc-devel isl-devel  
  # 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>
 
===== スクリプトの使用 =====
==== GCCのモジュールの使用 ====
[https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードする。<br>
[https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードして解凍する。<br>
ダウンロードしたファイルを解凍する。<br>
または、以下のコマンドを実行してダウンロードする。<br>
  tar xf gcc-<バージョン>.tar.gz
  wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-10.1.0/gcc-10.1.0.tar.xz
  cd gcc-<バージョン>
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-10.1.0/sha512.sum
  tar zxvf gcc-10.1.0.tar.gz -o src
<br>
<br>
次に、解凍したGCCのディレクトリに移動して、以下のコマンドを実行すると、依存関係のライブラリがダウンロードされる。<br>
ビルドに必要なライブラリをソースコードからビルドする場合、解凍したGCCのディレクトリに移動して、ライブラリをダウンロードする。<br>
  ./contrib/download_prerequisites
  ./contrib/download_prerequisites
<br>
<br>
ダウンロードされた依存関係のライブラリを解凍する。<br>
ダウンロードされた依存関係のライブラリを解凍する。<br>
  tar -xvf gmp-6.1.0.tar.bz2
  tar xf gmp-<バージョン>.tar.bz2
  tar -xvf mpfr-3.1.4.tar.bz2  
  tar xf mpfr-<バージョン>.tar.bz2  
  tar -xvf mpc-1.0.3.tar.gz  
  tar xf mpc-<バージョン>.tar.gz  
  tar -xvf isl-0.18.tar.bz2  
  tar xf isl-<バージョン>.tar.bz2  
<br>
<br>
これらのライブラリを全てインストールする。<br>
ビルドに必要なライブラリを、ビルドしてインストールする。<br>
* gmpのインストール
* GMPのインストール
  ./gmp-6.1.0/configure --prefix=$HOME/InstallSoftware/GCC/GCC-10_1_0 --enable-cxx
  ./gmp-<バージョン>/configure --prefix=<GCCのインストールディレクトリ> --enable-cxx
  make -j 8
  make -j $(nproc)
  make check
  make check
  make install
  make install
<br>
<br>
* mpfrのインストール
* MPFRのインストール
  ./mpfr-3.1.4/configure --prefix=$HOME/InstallSoftware/GCC/GCC-10_1_0 --with-gmp=$HOME/InstallSoftware/GCC/GCC-10_1_0
  ./mpfr-<バージョン>/configure --prefix=<GCCのインストールディレクトリ> --with-gmp=<GCCのインストールディレクトリ>
  make -s -j 8
  make -s -j $(nproc)
  make -s check
  make -s check -j $(nproc)
  make install
  make install
<br>
<br>
* mpcのインストール
* MPCのインストール
  ./mpc-1.0.3/configure --prefix=$HOME/InstallSoftware/GCC/GCC-10_1_0 --with-gmp=$HOME/InstallSoftware/GCC/GCC-10_1_0 --with-mpfr=$HOME/InstallSoftware/GCC/GCC-10_1_0
  ./mpc-<バージョン>/configure --prefix=<GCCのインストールディレクトリ> --with-gmp=<GCCのインストールディレクトリ> --with-mpfr=<GCCのインストールディレクトリ>
  make -s -j 8
  make -s -j $(nproc)
  make check -s -j 8
  make check -s -j $(nproc)
  make install
  make install
<br>
<br>
* islのインストール
* ISLのインストール
  ./isl-0.18/configure --prefix=$HOME/InstallSoftware/GCC/GCC-10_1_0 --with-gmp-prefix=$HOME/InstallSoftware/GCC/GCC-10_1_0
  ./isl-<バージョン>/configure --prefix=<GCCのインストールディレクトリ> --with-gmp-prefix=<GCCのインストールディレクトリ>
  make -j 8
  make -j $(nproc)
  make check
  make check
  make install
  make install
<br><br>
<br>
 
==== GCCのインストール ====
== GCCのインストール ==
[https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードする。<br>
[https://gcc.gnu.org GCCの公式Webサイト]にアクセスして、GCCのソースコードをダウンロードして解凍する。<br>
ダウンロードしたファイルを解凍する。<br>
または、以下のコマンドを実行してダウンロードする。<br>
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-<バージョン>/gcc-<バージョン>.tar.xz
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-<バージョン>/sha512.sum
  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>
  # /<GCC 7.1のソースディレクトリ>/libgcc/config/i386/linux-unwind.hファイルの61行目
  <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
   
   
  LD_LIBRARY_PATH=/<GMP, MPC MPFR, ISLのインストールディレクトリ>/lib64 make -j $(nproc)
  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>
インストールしたGCCへ環境変数のパスを通す。<br>
~/.profileファイル等に環境変数を設定する。<br>
  vi ~/.profile
  vi ~/.profile
<br>
<syntaxhighlight lang="sh">
# ~/.profileファイル
   
   
# .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をソースコードからインストールした場合、共有ライブラリが/<GCCのインストールディレクトリ>/lib64に作成されるが、<br>
環境変数のパスが通っていないため、Linuxから参照されない。<br>
<br>
<br>
そのため、以下のいずれかの方法で環境変数のパスを通す必要がある。<br>
==== GCCの設定 ====
* /etc/ld.so.confファイルに記述する。(システム全体)
GCCをソースコードからインストールした場合、共有ライブラリが <u>/<GCCのインストールディレクトリ>/lib64</u> ディレクトリ内に生成されるが、環境変数が設定されていない。<br>
* ~/.profileファイルまたは~/.bashrcファイル等に、LD_LIBRARY_PATHを記述する。(ユーザごとに設定が必要)
そのため、以下に示すいずれかの方法で環境変数のパスを通す必要がある。<br>
<br>
* システム全体に設定する場合
*: /etc/ld.so.confファイル
* ユーザごとに設定する場合
*: ~/.profileファイル等
*: 環境変数 <code>LD_LIBRARY_PATH</code> を設定する。
<br>
<br>
==== ld.so.confファイルに設定する ====
===== システム全体に設定する場合 =====
/etc/ld.so.confファイルに<code>/<GCCのインストールディレクトリ/lib64</code>を追記することで、Linuxがライブラリを認識する。<br>
/etc/ld.so.confファイルに <u>/<GCCのインストールディレクトリ/lib64</u> を追記することで、システム全体がライブラリを認識する。<br>
以下のコマンドを実行して、設定を追記する。<br>
  sudo vi /etc/ld.so.conf
  sudo vi /etc/ld.so.conf
<br>
# /etc/ld.so.confファイル
   
   
# /etc/ld.so.confファイル
  /<GCCのインストールディレクトリ/lib64
  /<GCCのインストールディレクトリ/lib64
<br>
<br>
上記の設定を反映させるため、<code>ldconfig</code>コマンドを実行する。<br>
設定を反映させる。<br>
  ldconfig -v
  ldconfig -v
<br>
<br>
<code>ldconfig</code>コマンドを実行した時に表示される情報から、<br>
<code>ldconfig</code> コマンドを実行した時に表示される情報から、<br>
以下のように、<code>/<GCCのインストールディレクトリ/lib64</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>コマンドを実行した結果、もし、以下のようなメッセージが表示された場合の対処方法を記載する。<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.
  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.pyは、pythonのスクリプトであるが、これを共有ライブラリとして認識していることが原因である。<br>
これは、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>
また、<u>CentOS 7の場合</u>、/etc/ld.so.confファイルに<code>include ld.so.conf.d/*.conf</code>と設定されているが、<br>
また、RHELおよびSUSEの場合、/etc/ld.so.confファイルに <u>include ld.so.conf.d/*.conf</u> と設定されている。<br>
これは、ld.so.conf.dディレクトリ内のconf拡張子をもつファイルの内容を読み込むという設定である。<br>
これは、ld.so.conf.dディレクトリ内のconf拡張子をもつファイルの内容を読み込むという意味である。<br>
<br>
システム全体に共有ライブラリのパスを設定するには、/etc/ld.so.conf.dディレクトリ内に該当するライブラリが存在するパスを記述した設定ファイルを作成する。<br>
<br>
<br>
ld.so.conf.dディレクトリ内に/<GCCのインストールディレクトリ>/lib64と記述したconfファイルを作成することにより、<br>
以下の例では、/etc/ld.so.conf.d/00-libstdc++.confファイルを作成している。<br>
Linuxに共有ライブラリのパスを認識させることができる。<br>
sudo vi /etc/ld.so.conf.d/00-libstdc++.conf
<br>
<br>
ここでは、/etc/ld.so.conf.d/UserAdd-lib64.confファイルを作成する。<br>
  # 00-libstdc++.confファイル
  sudo vi /etc/ld.so.conf.d/UserAdd-lib64.conf
   
   
# UserAdd-lib64.confファイル
  /<GCCのインストールディレクトリ>/lib64
  /<GCCのインストールディレクトリ>/lib64
<br>
<br>
上記の設定を反映させるため、<code>ldconfig</code>コマンドを実行する。<br>
設定を反映させる。<br>
  ldconfig -v
  ldconfig -v
<br>
<br>
==== LD_LIBRARY_PATHに設定する ====
===== 各ユーザごとに設定する場合 =====
この方法は、ユーザごとに設定する必要がある。<br>
この方法は、ユーザごとに設定する必要がある。<br>
~/.profileファイルまたは~/.bashrcファイル等に、LD_LIBRARY_PATHの設定を追加することで、ユーザがログインする際に設定が読み込まれる。<br>
<br>
~/.profileファイル等に環境変数<code>LD_LIBRARY_PATH</code>を設定することにより、ユーザがログインする際に設定が読み込まれる。<br>
  vi ~/.profile
  vi ~/.profile
<br>
<syntaxhighlight lang="sh">
# ~/.profileファイル
   
   
# ~/.profileファイル
  export LD_LIBRARY_PATH="/<GCCのインストールディレクトリ>/lib64:$LD_LIBRARY_PATH"
  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/<GCCのインストールディレクトリ>/lib64
</syntaxhighlight>
<br>
<br>
上記の設定を反映させるため、PCを再起動または再ログインする。<br>
上記の設定を反映させるため、PCを再起動または再ログインする。<br>
<br><br>
<br>
 
==== libstdc++を入れ替える場合 ====
== libstdc++の入れ替え ==
<u>この手順を行う場合、システムが不安定になる可能性があることに注意する。</u><br>
この操作を行うと、システムが不安定になる可能性があるため、必要な時にのみこれを行う。<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"      \  # バッファオーバーフロー攻撃に対する中程度の保護を有効化
--build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=aarch64-unknown-linux-gnu \
              CXXFLAGS="-g0 -O3 -fstack-protector-strong"    \  # バッファオーバーフロー攻撃に対する中程度の保護を有効化
--disable-gdb --disable-nls --disable-multilib --disable-werror \
              --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \
--enable-gold --enable-lto --enable-plugins --enable-relro \
              --build=x86_64-pc-linux-gnu \
--with-sysroot=<ターゲットのシステムルートディレクトリ> \
              --host=x86_64-pc-linux-gnu \
CFLAGS="-g0 -O3 -fstack-protector-strong" \
              --target=aarch64-linux-gnu \
CXXFLAGS="-g0 -O3 -fstack-protector-strong"
              --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                                             \
--build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --target=aarch64-unknown-linux-gnu \
              CFLAGS="-g0 -O3 -fstack-protector-strong"      \
--enable-languages=c,c++ --disable-bootstrap --disable-multilib --disable-nls \
              CXXFLAGS="-g0 -O3 -fstack-protector-strong"    \
  --with-sysroot=<ターゲットのシステムルートディレクトリ> \
              --prefix=<クロスコンパイラ向けGCCのインストールディレクトリ> \
  CFLAGS="-g0 -O3 -fstack-protector-strong" \
              --build=x86_64-pc-linux-gnu \
  CXXFLAGS="-g0 -O3 -fstack-protector-strong"
              --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/ NewLibの公式Webサイト]、または、[https://github.com/bminor/newlib/ NewLibのGithub]にアクセスして、NewLibのソースコードをダウンロードする。<br>
さらに、[https://sourceware.org/newlib/ Newlibの公式Webサイト]、または、[https://github.com/bminor/newlib/ NewlibのGithub]にアクセスして、Newlibのソースコードをダウンロードする。<br>
もし、NewLibの公式Webサイトからファイルをダウンロードできない場合は、<code>wget</code>コマンド等を使用してダウンロードする。<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月現在)、NewLibの公式Webサイトからダウンロードしたファイルを使用するとビルドに失敗するため、Githubからダウンロードすること。</u><br>
<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 --disable-libstdc__-v3 --enable-lto --enable-gold \
              --target=h8300-elf         \
               --with-newlib \
               --enable-languages=c,c++    \
               --with-headers=/<上記でダウンロードしたNewLibのディレクトリ>/newlib/libc/include
               --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>
次に、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 --enable-lto --enable-gold \
              --target=h8300-elf         \
               --with-newlib \
               --enable-languages=c,c++   \
               --with-headers=/<上記でダウンロードしたNewLibのディレクトリ>/newlib/libc/include
               --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://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf
* GCCツールチェーン群
* Windows x86 / Linux x86の場合
*: https://snapshots.linaro.org/gnu-toolchain/
*: gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf.tar.xz
* GCC 10.2 (Bullseye 32ビット向け)
* Linux x64の場合
*: https://snapshots.linaro.org/components/toolchain/binaries/10.2-2021.01-3/arm-linux-gnueabihf/
*: gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
* 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 Float版)向けにビルドする場合
  # 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 \
CC=/<GCC_ARMのインストールディレクトリ>/bin/arm-none-linux-gnueabihf-gcc \
  ../configure --prefix=<ソフトウェアのインストールディレクトリ>                             \
CXX=/<GCC_ARMのインストールディレクトリ>/bin/arm-none-linux-gnueabihf-g++ \
              CC=/<GCC_ARMのインストールディレクトリ>/bin/arm-none-linux-gnueabihf-gcc \
--build=x86_64-unknown-linux-gnu --host=arm-none-linux-gnueabihf --target=arm-none-linux-gnueabihf \
              CXX=/<GCC_ARMのインストールディレクトリ>/bin/arm-none-linux-gnueabihf-g++ \
--with-sysroot=/<GCC_ARMのインストールディレクトリ>/arm-none-linux-gnueabihf/libc --with-gnu-ld
              --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"
                  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 \
CC=/<GCC_ARMのインストールディレクトリ>/bin/aarch64-none-linux-gnu-gcc \
  ../configure --prefix=<ソフトウェアのインストールディレクトリ>                           \
CXX=/<GCC_ARMのインストールディレクトリ>/bin/aarch64-none-linux-gnu-g++ \  
              CC=/<GCC_ARMのインストールディレクトリ>/bin/aarch64-none-linux-gnu-gcc \
--build=x86_64-unknown-linux-gnu --host=aarch64-none-linux-gnu --target=aarch64-none-linux-gnu \
              CXX=/<GCC_ARMのインストールディレクトリ>/bin/aarch64-none-linux-gnu-g++ \  
--with-sysroot=/<GCC_ARMのインストールディレクトリ>/aarch64-none-linux-gnu/libc --with-gnu-ld
              --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"
                  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 \
CC=/<GCC_ARMのインストールディレクトリ>/bin/arm-linux-gnueabihf-gcc CXX=/<GCC_ARMのインストールディレクトリ>/bin/arm-linux-gnueabihf-g++ \
ac_cv_func_realloc_0_nonnull=yes \
--build=x86_64-unknown-linux-gnu --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
  ../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__
[[カテゴリ:CentOS]][[カテゴリ:SUSE]]
[[カテゴリ:RHEL]][[カテゴリ:SUSE]]