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

412行目: 412行目:
<br>
<br>
異なるABIでコンパイルされたライブラリとプログラムは、例え同じCPUアーキテクチャであっても正しく連携できない。<br>
異なるABIでコンパイルされたライブラリとプログラムは、例え同じCPUアーキテクチャであっても正しく連携できない。<br>
<br>
Hard Float ABIでは、浮動小数点演算の結果を浮動小数点専用のレジスタ (VFPレジスタ) を使用して関数間で受け渡す。<br>
<br>
<br>
  mkdir build && cd build
  mkdir build && cd build
   
   
cmake -G Ninja \
cmake -G Ninja \
      -DCMAKE_BUILD_TYPE=Release                            \
      -DCMAKE_BUILD_TYPE=Release                            \
      -DCMAKE_INSTALL_PREFIX=<LLVMツールチェーンのインストールディレクトリ> \
      -DCMAKE_INSTALL_PREFIX=<LLVMツールチェーンのインストールディレクトリ> \
      -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld"  \
      -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld"  \
      -DLLVM_TARGETS_TO_BUILD="X86;ARM;AArch64"            \
      -DLLVM_TARGETS_TO_BUILD="X86;ARM;AArch64"            \
      -DLLVM_ENABLE_LLD=ON                                  \
      -DLLVM_DEFAULT_TARGET_TRIPLE=arm-linux-gnueabihf      \
      -DLLVM_ENABLE_LIBCXX=OFF                              \
      -DLLVM_ENABLE_LLD=ON                                  \
      -DLLVM_ENABLE_ASSERTIONS=OFF                          \
      -DLLVM_ENABLE_LIBCXX=OFF                              \
      -DLLVM_OPTIMIZED_TABLEGEN=ON                          \
      -DLLVM_ENABLE_ASSERTIONS=OFF                          \
      -DLLVM_USE_LINKER=lld                                \
      -DLLVM_OPTIMIZED_TABLEGEN=ON                          \
      -DLLVM_PARALLEL_LINK_JOBS=2                          \
      -DLLVM_USE_LINKER=lld                                \
      ../llvm
      -DLLVM_PARALLEL_LINK_JOBS=2                          \
      ../llvm
   
   
  ninja -j $(nproc)
  ninja -j $(nproc)
  ninja install
  ninja install
<br>
Hard Float ABI用のCMakeツールチェーンファイルの例を以下に示す。<br>
<syntaxhighlight lang="cmake">
# ターゲットシステムの設定
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
# システムルートのパス (Hard Float ABI用のシステムルート)
set(CMAKE_SYSROOT <Hard Float ABI用のシステムルートのフルパス>)
# LLVMツールチェーンのパス
set(LLVM_PATH <LLVMツールチェーンのインストールディレクトリ>)
# コンパイラの指定
set(CMAKE_C_COMPILER ${LLVM_PATH}/bin/clang)
set(CMAKE_CXX_COMPILER ${LLVM_PATH}/bin/clang++)
# ターゲットトリプルの設定
# Hard Float ABIを使用するため、末尾に"hf"を追加
set(CMAKE_C_COMPILER_TARGET arm-linux-gnueabihf)
set(CMAKE_CXX_COMPILER_TARGET arm-linux-gnueabihf)
# 検索パスの設定
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
# コンパイラフラグの設定
# Hard Float ABIを明示的に指定し、適切なFPUも指定する
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a -mfpu=neon-vfpv4 -mfloat-abi=hard")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a -mfpu=neon-vfpv4 -mfloat-abi=hard")
# リンカーフラグ
# ライブラリパスをHard Float ABI用のディレクトリに変更
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath-link,${CMAKE_SYSROOT}/lib/arm-linux-gnueabihf")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath-link,${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabihf")
</syntaxhighlight>
<br>
==== ARM EABI ====
Soft Float ABIでは、浮動小数点の値も汎用レジスタを使って受け渡す。<br>
<br>
Soft Float ABIが必要になる場面は、古いARMプロセッサやFPU (浮動小数点演算ユニット) を持たない組み込みシステムである。<br>
ARMv5 や ARMv6の一部のバリアント、コスト重視の産業用制御システムなどがこのカテゴリに入る。<br>
これらのシステムでは、浮動小数点演算は全てソフトウェアでエミュレートされるため、VFPレジスタを使った受け渡しができない。<br>
<br>
ただし、FPUを持つプロセッサであっても、Soft Float ABIでコンパイルすることは可能である。<br>
この場合、FPUは利用されず全ての浮動小数点演算がソフトウェアで処理される。<br>
これは、既存のSoft Float ABI用のライブラリとの互換性を保ちたい場合等に用いられる。<br>
<br>
mkdir build && cd build
cmake -G Ninja \
      -DCMAKE_BUILD_TYPE=Release                          \
      -DCMAKE_INSTALL_PREFIX=<LLVMツールチェーンのインストールディレクトリ> \
      -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld" \
      -DLLVM_TARGETS_TO_BUILD="X86;ARM;AArch64"            \
      -DLLVM_DEFAULT_TARGET_TRIPLE=arm-linux-gnueabi      \
      -DLLVM_ENABLE_LLD=ON                                \
      -DLLVM_ENABLE_LIBCXX=OFF                            \
      -DLLVM_ENABLE_ASSERTIONS=OFF                        \
      -DLLVM_OPTIMIZED_TABLEGEN=ON                        \
      -DLLVM_USE_LINKER=lld                                \
      -DLLVM_PARALLEL_LINK_JOBS=2                          \
      ../llvm
ninja -j $(nproc)
ninja install
<br>
Soft Float ABI用のCMakeツールチェーンファイルの例を以下に示す。<br>
<syntaxhighlight lang="cmake">
# ターゲットシステムの設定
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
# システムルートのパス (Soft Float ABI用のシステムルート)
set(CMAKE_SYSROOT <Soft Float ABI用のシステムルートのフルパス>)
# LLVMツールチェーンのパス
set(LLVM_PATH <LLVMツールチェーンのインストールディレクトリ>)
# コンパイラの指定
set(CMAKE_C_COMPILER ${LLVM_PATH}/bin/clang)
set(CMAKE_CXX_COMPILER ${LLVM_PATH}/bin/clang++)
# ターゲットトリプルの設定
set(CMAKE_C_COMPILER_TARGET arm-linux-gnueabi)
set(CMAKE_CXX_COMPILER_TARGET arm-linux-gnueabi)
# 検索パスの設定
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
# コンパイラフラグの設定
# Soft Float ABIを明示的に指定する
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv7-a -mfloat-abi=softfp")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7-a -mfloat-abi=softfp")
# リンカーフラグ
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath-link,${CMAKE_SYSROOT}/lib/arm-linux-gnueabi")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath-link,${CMAKE_SYSROOT}/usr/lib/arm-linux-gnueabi")
</syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:RHEL]][[カテゴリ:SUSE]]
[[カテゴリ:RHEL]][[カテゴリ:SUSE]]