問題タブ [linker-scripts]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ld - リンカスクリプトのセクションロードアドレスと実行アドレス
ベアメタル ARM アプリケーション用にカスタマイズされたリンカー スクリプトを作成しています。アプリケーションはフラッシュ メモリに保存されます。現時点では、アプリケーション全体を SDRAM にコピーする起動コードがあり、高速化のために SDRAM で実行を続けています。このスクリプトを変更して、コード全体をフラッシュから直接実行したいのですが、特定の要素を理解するのに問題があります。
以下のリンカ スクリプトでは、.ram_data
セクションに実行アドレスRAM
とロード アドレスがありますROM
(どちらのセクションも SDRAM にあります)。私が理解していることから、リンカーは実行アドレスを使用して、PC 相対ではないすべての要素のシンボル解決を行いますが、ロードアドレスはどうですか? ベアメタル ARM のコンテキストでは、プログラム ローダーのようなものは存在せず、リンカがフラッシュ内のプログラムを書き込む場所に影響を与えることはできません。では、リンカは実際には何に使用されるのでしょうか?
同様に、リンカは実行時に SDRAM が (rx) または (rw) であることにどのように影響を与えることができますか? メモリ領域でこれらのオプションを変更すると、実際に何かが変更されますか?
gcc - GCC - セクションの LMA が間違っている
リンカー スクリプトに問題があります。セクション .data2、.nonsharedram、および .bss の LMA が間違っています。これらは FLASH に配置する必要がありますが、代わりに SHARED1 および SHARED2 領域に配置されます。
リンカー スクリプト:
objdump から:
mips - GNU ld を使用して、「relocation truncated」エラーを発生させずに特定の (外部) シンボルのアドレスを強制するにはどうすればよいですか?
2 つの関数 と がa()
ありb()
、どちらも特定の固定ロード/ランタイムアドレスを持っています。私はa()
自分自身をコンパイルしb()
ていますが、既に提供されています (たとえば、ROM で)。
ファイルa.c
は次のとおりです。
これにより、次のアセンブリ コードが生成されます。
したがって、そこに 26 ビットの再配置を配置してb()
います (呼び出しのターゲットは、呼び出し命令自体のアドレスからの 26 ビットのオフセットです)。と の特定のアドレスがそれぞれ 0x80001000 と 0x80002000 であるとしますa
。b
それでいいはずです。b
簡単に手の届くところにありa
ます。
したがって、リンカー スクリプトには次のようなものがあります。
ただし、このスクリプトとリンクa.o
すると、次のエラーが発生します。
これはおそらく、リンカが完全な 32 ビット値 ( 0x80002000
) をジャンプ先の 26 ビット空間に収めようとしていることが原因です。リンカー スクリプトの何が問題になっていますか?
c - 別の起動ファイルとのリンク
STARTUP
LD スクリプトでディレクティブを使用して、プログラムを独自のスタートアップ ファイルにリンクしようとしています。
GCC ドライバーは、プログラムをリンクするために使用されます (libgcc などのライブラリ パスを気にしないでください)。
残念ながら、powerpc ターゲット用にコンパイルされた GCC でのみ動作しますが、arm または i686 ターゲットは、collect2 に crt0.o を含めず、まだ含んでいます。例えば:
私に与えます:
したがって:
ディレクティブは完全に無視されているようでSTARTUP
(ディレクティブが指定されていない限り、powerpc ターゲットはデフォルトの crt0 も使用しますSTARTUP
)、デフォルトの crt0 を無効にする方法はありません。
別の起動ファイルにリンクするポータブルな方法はありますか?
私の起動ファイルはlibgcc
関数を使用して (ctors と dtors を呼び出すためcrtbegin.o
) 、 などが必要なので、無効にするオプションをcrtend.o
避けたいと思います- 無効にする必要があるだけです。-nostartfiles
crt*.o
crt0.o
ありがとうございました