📢 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_INSTALL_PREFIX=<LLVMツールチェーンのインストールディレクトリ> \ | |||
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld" \ | |||
-DLLVM_TARGETS_TO_BUILD="X86;ARM;AArch64" \ | |||
-DLLVM_DEFAULT_TARGET_TRIPLE=arm-linux-gnueabihf \ | |||
-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 -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]] | ||