6.7 $Super$$ と $Sub$$ を使用したシンボル定義へのパッチの適用

既存のシンボルを変更できない場合に使用できる特別なパターンがあります。

例えば、外部ライブラリや ROM コード内に含まれている場合、既存のシンボルを変更できません。このような場合、$Super$$ パターンと $Sub$$ パターンを使用して既存のシンボルにパッチを適用します。
関数 foo() の定義にパッチを適用するには、以下を使用します。
$Super$$foo
パッチを適用していない元の関数 foo() を識別します。このパターンを使用して、元の関数を直接呼び出します。
$Sub$$foo
元の関数 foo() の代わりに呼び出す新しい関数を識別します。このパターンを使用して、元の関数の前または後に処理を追加します。

$Sub$$$Super$$ のメカニズムは静的なリンク時にのみ機能します。$Super$$ の参照をダイナミックシンボルテーブルにインポートまたはエクスポートすることはできません。

以下の例では、$Super$$ および $Sub$$ を使用して、既存の関数 ExtraFunc() への呼び出しの前に、関数 foo() への呼び出しを挿入する方法を示しています。
extern void ExtraFunc(void); extern void $Super$$foo(void):
/* この関数が元の関数 foo() の代わりに呼び出される */
void $Sub$$foo(void)
{
  ExtraFunc();    /* 追加のセットアップ作業を行う */
  $Super$$foo();  /* 元の関数 foo() を呼び出す */
                  /* 元の関数 foo() の呼び出しを回避するには
                   * $Super$$foo(); 関数の呼び出しを省略する。
                   */
}
関連情報
ELF for the ARM Architecture
非機密扱いPDF file icon PDF 版ARM DUI0474LJ
Copyright © 2010-2015 ARM.All rights reserved.