1

ファームウェアで宣言されているすべてのグローバルオブジェクトのコンストラクターを呼び出すために、すべての.init_arrayセクションを収集するLDのリンカースクリプトを作成しています。

静的ライブラリに参照されていないグローバルオブジェクトがない限り、すべてが正常に機能します。この場合、KEEPマクロを次のように使用しているにもかかわらず、オブジェクトは明示的に参照されていませんが、最終的なバイナリで破棄されます。(-gc-sectionsを使用するかどうかは関係ありません)。

まったく同じ参照されていないオブジェクトが静的ライブラリの外部に配置され、リンカースクリプトの汎用行によってキャッチされた場合、そのオブジェクトは含まれます。

.init_array :
{
   _init_array_start = .;
   KEEP (*core*:*(SORT(.init_array*)))
   KEEP (*core*:*(.init_array))
   KEEP (*(SORT(.init_array.*)))
   KEEP (*(.init_array))
   PROVIDE (_init_array_end = .);
} > flash

ライブラリはlibcore.aと呼ばれます。libcore.aで明示的に参照されている他のオブジェクトは含まれます。

これを修正する方法についての助けは本当にありがたいです。

前もって感謝します

4

1 に答える 1

1

静的ライブラリは、実際には複数のファイルとインデックスarを含むアーカイブです。.oインデックスは.o、メインプログラムによって参照されたシンボルに基づいて、リンクするファイルを決定するために使用されます。そのため、.oファイルのシンボルが参照されていない場合、リンカは問題のファイルをロード.oすることすらできないため、リンカスクリプトがそのファイルを取得することはありません。

GNU LDを使用していると仮定すると、ld-rフラグを使用して複数の.oファイルを1つのファイルに結合し、それをアーカイブ内libcore.oの唯一のファイルとして使用できます。これの欠点は、ファイル.oをスキップすることで省略される可能性のある不要なコードを取り込む可能性があることです。または、静的コンストラクターを使用して、アーカイブ内の.o他のすべてのファイルからファイルにダミー参照を追加することもできます。.o.o

于 2012-10-13T10:06:48.550 に答える