1. ホーム
  2. c++

[解決済み] GCCとldで未使用のC/C++シンボルを削除する方法は?

2022-06-04 20:27:08

質問

実行ファイルのサイズを厳しく最適化する必要があります ( ARM 開発) と 現在のビルドスキームでは ( gcc + ld ) 未使用のシンボルが取り除かれることはありません。

の使い方は arm-strip --strip-unneeded を使用しても、実行ファイルやライブラリの出力サイズは変わりません。 の出力サイズを変更しません (その理由は不明です。単に変更できないだけかもしれません)。 .

どのような方法で (存在すれば) を変更し、結果のファイルから未使用のシンボルを削除するにはどうしたらよいでしょうか。


私はこれを考えもしませんでしたが、私の現在の組み込み環境はあまり強力ではありません。 を保存することさえ 500K のうち 2M に変更すると、読み込みのパフォーマンスが非常に向上します。

更新しました。

残念ながら、現在の gcc バージョンは、私が使っている -dead-strip オプションがなく -ffunction-sections... + --gc-sections に対して ld を使っても、結果の出力に大きな違いは出ません。

と確信していたので、これが問題になったことにショックを受けています。 gcc + ld は自動的に未使用のシンボルを取り除くはずだと確信していたからです (なぜ彼らはそれを保持する必要さえあるのでしょうか?)。

どのように解決するのですか?

GCCの場合、これは2つの段階で達成されます。

最初にデータをコンパイルしますが、コンパイラにコードを翻訳ユニット内の別々のセクションに分離するように指示します。これは、関数、クラス、および外部変数に対して、以下の2つのコンパイラフラグを使用することにより行われます。

-fdata-sections -ffunction-sections

リンカ最適化フラグを使用して翻訳ユニットをリンクします(これにより、リンカは参照されないセクションを破棄します)。

-Wl,--gc-sections

つまり、test.cppという1つのファイルに2つの関数が宣言されていて、そのうちの1つが使われていない場合、gcc(g++)に以下のコマンドで使われていない方を省略することができるのです。

gcc -Os -fdata-sections -ffunction-sections test.cpp -o test -Wl,--gc-sections

(-OsはGCCにサイズの最適化を指示する追加のコンパイラフラグであることに注意してください)