アプリケーションにブランチ保護を使用
ブランチ保護を使用するには、アプリケーション起動コードにいくつか小さい変更を行う必要があります。リンカが、すべてのリンクされたアプリケーションモジュールがブランチ保護をサポートしているかどうかをチェックする方法を制御することもできます。
ブランチターゲット識別
ブランチターゲット識別 (BTI)を使用するには、--branch_protection=bti または --branch_protection=bti+pac-ret と共にアプリケーションをコンパイルして、BTI_ENビットをプロセッサCONTROLレジスタで設定して起動コードのBTIを有効にする必要があります。cstartup.sファイルを使用している場合は、これを実装するベストな方法は、関数__low_level_initを定義することです。cstartup.sおよび__low_level_initの詳細については、システムの起動と終了を参照してください。
#include <arm_acle.h>
void __low_level_init(void)
{
unsigned int old_ctrl = __arm_rsr("CONTROL");
__arm_wsr("CONTROL", old_ctrl | 0x10);
// Enables BTI by setting bit #4 in CONTROL
}注意
IDEで、[プロジェクト]>[オプション]>[C/C++ コンパイラ]>[コード] >[ブランチターゲット識別]を使用してBTIを有効にします。
ポインタ認証
ポインタ認証(PAC)を使用するには、--branch_protection=pac-retまたは --branch_protection=bti+pac-retをを使用してアプリケーションをコンパイルし、認証キーを初期化して、起動コードでPACを有効にする必要があります。cstartup.sファイルを使用している場合は、これを実装するベストな方法は、関数__low_level_initを定義することです。cstartup.sおよび__low_level_initの詳細については、システムの起動と終了を参照してくください。
void __low_level_init(void)
{
// Set up a 128-bit key in 4 parts:
__arm_wsr("PAC_KEY_P_0", key[0]);
__arm_wsr("PAC_KEY_P_1", key[1]);
__arm_wsr("PAC_KEY_P_2", key[2]);
__arm_wsr("PAC_KEY_P_3", key[3]);
unsigned int old_ctrl = __arm_rsr("CONTROL");
__arm_wsr("CONTROL", old_ctrl | 0x40);
// Enables PAC by setting bit #6 in CONTROL
}注意
IDEで、[プロジェクト]>[オプション]>[C/C++ コンパイラ]>[コード] >[ポインタ認証]を使用してPACを有効にします。
リンク
アプリケーションのすべてのモジュールが、PAC、BTI、またはその両方を使用していることを確約するには、これらのオプションの1つ以上を使用して、リンク時にリンカがモジュールをチェックする方法を制御できます。
‑‑library_security(‑‑library_securityを参照)‑‑require_bti(‑‑require_btiを参照)‑‑require_pac(‑‑require_pacを参照)