私のユースケースは次のとおりです。
- Makefileベースのプロジェクトに付属している典型的なSDKを使用しています
- リンカーにはパッチが適用されたgccがあると思います。gcc--versionは4.3.4を与えます
- SDKはリンカースクリプトを定義します(Linker.ldと呼びます)
- Linker.ldには、リンクされたELFイメージのさまざまなセクションの絶対アドレスを定義するLinkerMemMap.cfgが含まれています。
- SDKは、Makefile(GNU Make 3.81)に基づくアプリケーションテンプレートを提供し、それ自体を作成します
- SDKが提供するMakefileテンプレートでは、gccが呼び出されると、次のようにLinker.ldに-Tコマンドラインオプションが提供されます。
gcc $(OBJS) -l$(Lib1) -l$(Lib2) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections -o$(OUTPUT).elf
私の要件は次のとおりです。
- Linker.ldで定義されているセクションを使用し、LinkerMemMap.cfgに従ってメモリマップを使用したいのですが、LinkerMemMap.cfgで定義されている特定のシンボル(SYMBOL_RAM_STARTと呼びます)を微調整します。
何が機能するか:
- 最終的なELFイメージをリンクする前に、makefileで試しましたが、LinkerMemMap.cfg(Linker.ldに含まれています)をビルドディレクトリにコピーし、パッチを適用してSYMBOL_RAM_STARTを再定義します。これは、リンカーがリンカースクリプトと、現在のフォルダー内のリンカースクリプトに含まれるファイルを最初に検索するときに機能します。
しないこと:
残念ながら、私たちの利害関係者は、上記の方法はリスクが高く複雑すぎて理解できないと考えています。リンカコマンドラインのシンボル値を次のように上書きしたいと思います。
gcc $(OBJS) -l$(Lib1) -l$(Lib2) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections,--defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -o$(OUTPUT).elf
gcc $(OBJS) -l$(Lib1) -l$(Lib2) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections --defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -o$(OUTPUT).elf
gcc $(OBJS) -l$(Lib1) -l$(Lib2) --defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections -o$(OUTPUT).elf
これらはいずれも、リンカーによって作成されたリンクされたイメージに影響を与えないようです。
- --defsymは、-Tを使用して指定されたlinkerscriptによって定義されたシンボルをオーバーライドできますか?
- 私がここで何を間違っているのか見てください。