0

私はmakefileプロジェクトを研究しています。私は gnu gcc を使用しており、リンカとして、次の引数で gcc を使用しています。

linkerCmdLine=$(exe) -Wl,--start-group -nostdlib -Map=test_mapfile.map -l:libc.a -l:libgcc.a -l:libm.a -Wl,--end-group -o $(出力)

リンク プロセス中、リンカーはこのフラグのすべてを使用しません。フラグ-Map=test_mapfile.mapは使用されません。

どうして??

プロジェクト設定ファイルがあり、このファイルにはリンカー設定も保存されています。

\u201ClinkerCmdLine\=$(exe) -Wl, --start-group -nostdlib -Map\=./99_output/PUZ_GPF.map --gc-sections -l\:libc.a -l\:libgcc.a -l \:libm.a -Wl,--end-group -o $(出力)\u201D

設定を正しく保存するにはどうすればよいですか?

編集:

マップ ファイルでは正常に動作しますが、実際にはリンカー ファイルに問題があります。次のフラグのみを使用します。

"linkerCmdLine=$(exe) -Wl, --script=C:/workspace/test_project/test_linker_file.ld -static -o $(output)"

コンソール ウィンドウに次のエラーが表示されます。

arm-none-eabi-gcc.exe: エラー: 認識できないコマンド ライン オプション '--script=C:/workspace/test_project/test_linker_file.ld'

マップ ファイルと .ld ファイルはリンカー フラグに属しているため、理由がわかりません。

4

1 に答える 1

3

プレフィックスは現在の-Wl,引数のみを渡し、カンマでリンカー引数を区切ります。したがって、 を渡す-z defsには、 を使用します-Wl,-z,defs

このメカニズムは、真のフラグの場合、つまりコマンド ラインの位置が無関係な場合にのみ機能します。パラメータはフラグではなく、-lgcc コンパイラ ドライバはそれらを個別のリストに収集し、単一のブロックで渡します。

したがって、この手法は、必要な正確なコマンドラインでは機能しません。一方、はデフォルトである を-nostdlib禁止-lc -lgcc -lmします。

通常、gcc 仕様 (コンパイラ ドライバのスクリプト) には、静的にリンクするときに標準ライブラリを使用するための規定があり--start-groupます--end-group(これはあなたがやりたいことのようです)。

だから私は思う

linkerCmdLine=$(exe) -Wl,-Map=test_mapfile.map -static -o $(output)

あなたのケースでうまくいくはずです。

于 2014-02-24T09:06:18.423 に答える