1.6.4 非セミホスティング環境でのライブラリの使用

C ライブラリ関数の中には、セミホスティングを使用するものもあります。非セミホスティング環境でライブラリを使用する場合は、セミホスティング関数呼び出しが適切に処理されることを確認する必要があります。

セミホスティングを使用しない場合は、いずれかの方法を実行します。
  • セミホスティング関数に対するすべての呼び出しを削除する方法。
  • fputc() など、低レベル関数を再実装する方法。すべてのセミホスティング関数を再実装する必要はありませんが、アプリケーションで使用するセミホスティング関数は再実装する必要があります。
    C ライブラリをターゲット依存関数から分離するときに使用される関数を再実装する必要があります。例えば、printf() を使用する場合は、fputc() を再実装する必要があります。printf() のような高レベル入出力関数を使用しない場合は、fputc() などの低レベル関数を再実装する必要はありません。
  • 独自の方法で処理するためにすべてのセミホスティング呼び出し用のハンドラを実装する方法。1 つの例として、ハンドラが呼び出しをインターセプトして、ターゲット固有の独自の非セミホスト関数にリダイレクトします。
セミホスティングを使用する関数がアプリケーションに存在しないことを確実にするには、以下のいずれかを使用します。
  • armasm アセンブリ言語からの IMPORT __use_no_semihosting
  • C からの #pragma import(__use_no_semihosting)

IMPORT __use_no_semihosting は、単一のアセンブリソースファイルにしか追加する必要がありません。同様に、#pragma import(__use_no_semihosting) は、単一の C ソースファイルにしか追加する必要がありません。これらの関数を全ソースファイルに追加する必要はありません。
セミホスティングを使用するライブラリ関数をインクルードし、__use_no_semihosting も参照している場合は、ライブラリによって競合するシンボルが検出され、リンカによってエラーが報告されます。どのオブジェクトがセミホスティングを使用しているかを判断するには、以下の手順に従います。
  1. armlink --cpu=8-A.32 --verbose --list err.txt でリンクします。
  2. err.txt__I$use$semihosting の出現個所を探します。
    以下に例を示します。
    ...Loading member sys_exit.o from c_4.l. reference :__I$use$semihosting definition:_sys_exit ...
    これは、セミホスティング使用関数 _sys_exit が C ライブラリからリンクされていることを示しています。この問題を避けるには、この関数の独自の実装を用意する必要があります。
There are no target-dependent functions in the C++ library, although some C++ functions use underlying C library functions that are target-dependent.
関連する概念
1.1 C ライブラリへのリンケージが必須
関連する参考文書
1.6.3 $Sub$$ を使用してセミホストと非セミホストの I/O 機能を混合
1.6.6 C ライブラリ関数の間接セミホスティング依存関数
1.6.7 異なる環境をターゲットとした C ライブラリ API 定義
関連情報
--list=filename リンカオプション
--verbose リンカオプション
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.