ホーム > ユーザーサポート > FAQ カバレッジマスターwinAMS

FAQ / カバレッジマスターwinAMS

スタブ作成に関する問題

002_02 : 「スタブ設定」でスタブ関数を作成し、ビルド、リンクしましたが、「関数シンボルが存在しません」のエラーで、スタブ関数が認識されません。

【質問】
「スタブ設定」の機能でスタブ関数を作成し、スタブのソースファイルを開発環境でビルド、リンクしましたが、シミュレータでテスト実行中にエラーとなってしまいます。(関数、変数シンボルが存在しない等のエラー。)何が原因でしょうか?


【回答】
ビルドしたスタブ関数が実行オブジェクトに入っていないことが考えられます。以下の原因が考えられます。

1)スタブソースファイルの先頭にある#ifdef WINAMS_STUB が無効になっている

カバレッジマスターで生成したスタブソースファイルの先頭には、スタブソース全体を囲む#ifdef WINAMS_STUB が入っています。開発環境のプリプロセッサ設定で、WINAMS_STUB が#defineされていない場合は、スタブソースファイルはビルドの対象になりません。この場合は、WINAMS_STUBを#defineに加えてください。

2)開発環境のリンカの最適化でスタブ関数がリンクから外されている

カバレッジマスターで生成したスタブ関数は、アプリケーションのどこからも呼ばれない孤立した関数となっています。このため、コンパイラやリンカの最適化によっては、スタブ関数が未使用関数として認識され、リンクされずオブジェクトファイルに含まれないことがあります。この場合は、スタブソース内にスタブ関数をリンクさせるためのダミーコードが必要となります。

コンパイラ/リンカの仕様に依存しますが、一般的には、スタブ関数の関数ポインタ配列をvolatile宣言によりグローバル領域に作成して置くことで、その関数はリンクの対象となります。
例えば、スタブ関数 AMSTB_func1、AMSTB_func2, AMSTB_func3 がある場合には、スタブソースファイルの最後に、

volatile int (*dummyfunc[])() = { AMSTB_func1, AMSTB_func2, AMSTB_func3 };

を追加することで対応可能です。

IAR社製のコンパイラをご利用の場合、「__root」キーワードによって問題を回避できる可能性があります。具体的には

__root int AMSTB_func1(int arg0)
{
  ...
}

のように、スタブ関数の先頭に「__root」を付加します。

 

関連サポート情報検索

【サポート情報サイト内Google検索】

検索キーワード: スタブ関数シンボル | リンカ最適化

他のキーワード検索


参考情報・リンク