Cortex-M4がリンカースクリプトにARMからThumbへの接着剤を含むのはなぜですか

Aug 22 2020

STM32チップ上のARMCortexM4のコードに取り組んでいます。

私の理解では、Cortex-M4には32ビットの命令がいくつかありますが、これらは32ビットのARM命令ではなく、いくつかの特別な命令にすぎません。接着剤は、ARMとthumb命令セットの間を移行するためのものだと思いました。では、なぜリンカースクリプトに接着剤が必要なのですか?

.text :
{
. = ALIGN(4);
*(.text)           /* .text sections (code) */
*(.text*)          /* .text* sections (code) */
*(.glue_7)         /* glue arm to thumb code */
*(.glue_7t)        /* glue thumb to arm code */

プロセッサはサンプ命令のみをサポートしているので、glue_7とglue_7tを削除できますか?これを行うことで解放されるフラッシュメモリはありますか?

回答

1 Jose Aug 23 2020 at 03:08

投稿されたスクリプトは常にthumb / ARMを呼び出すARM / thumbコードのセクションを作成します。呼び出すものがない場合、セクションは空です。空のセクションは無害です。

あなたはリンカを変更することなく、未使用セクションを削除したい場合は、きれいな方法を実行しているデッドコード削除を経由して、--gc-sections:

これらのオプションを使用してオブジェクトと静的ライブラリを作成すると、リンカはデッドコードの除去を実行できます。これを行うには、-Wl、-gc-sectionsオプションをgccコマンドに設定するか、gnatmakeの-largsセクションで行います。これにより、参照されたことのないコードとデータのガベージコレクションが実行されます。