ArduinoIDE環境でライブラリ使用時の未使用関数等の削除について


Spresense を ArduinoIDE で使用しています。  
未使用関数等が多いライブラリを使用時のプログラムサイズ削減の方法について質問します。

U8g2
などの未使用のフォントデータ等が多いライブラリを使用する際、プログラムサイズを超過することがありました。そのため、コンパイル・リンカオプションで未使用関数等の削除を行うよう設定したところ、実行時に異常終了してしまいます。ライブラリを使用しないシリアル出力だけのコードでも異常終了するため、オプションでの削除は不可能のようです。  
ライブラリから必要なコードだけ抜き出して使用する以外で、なにか解決方法はありませんでしょうか？

◆"platform.txt" 変更内容  
compiler.c.flags : -ffunction-sections -fdata-sections を追加  
compiler.cpp.flags : -ffunction-sections -fdata-sections を追加  
compiler.c.elf.flags : -Wl,--gc-sections を追加

◆サンプルコード

[code]

    #include <U8g2lib.h> //あってもなくても異常終了する
    void setup() {
      Serial.begin(115200);
      Serial.println("START");
    }
    void loop() {
    }
    
[/code]




改めて gc-sections オプションが使えない理由を調べてみました。

> ◆"platform.txt" 変更内容  
>  compiler.c.flags : -ffunction-sections -fdata-sections を追加  
>  compiler.cpp.flags : -ffunction-sections -fdata-sections を追加  
>  compiler.c.elf.flags : -Wl,--gc-sections を追加

を付けたときに、グローバルコンストラクタのテーブルが削除されてしまい、それに起因して実行時にエラーが発生していたようです。

リンクスクリプトファイル  
Arduino15/packages/SPRESENSE/tools/spresense-
sdk/1.x.x/spresense/release/prebuilt/build/ramconfig.ld  
Arduino15/packages/SPRESENSE/tools/spresense-
sdk/1.x.x/spresense/debug/prebuilt/build/ramconfig.ld  
の .init_array を KEEP()で囲むことで、

[code]

    *(.init_array .init_array.*) → KEEP (*(.init_array .init_array.*))
    
[/code]

実行時のエラーがなくなりました。

解決方法としてこちらの方が良さそうです。




そのオプションはどこからも参照されない関数や変数を生成しないというものなので、割り込みハンドラ関数などは軒並み削除対象となってしまいます  
必要な割り込みハンドラは削除しないように指定する必要がありますね

