GCCリンカスクリプトのENTRYとSTARTUPコマンドとちょっと混乱します。特定のアドレスへのリンク機能
ここで述べたように:http://wiki.osdev.org/Linker_Scripts
ENTRY()は任意のシンボルは.textセクションの最初の項目としてリンクすることができます。 STARTUP()は一方で、コンパイルされたファイル全体を.textセクションの最初の項目として配置します。
私のプロジェクトでは、しかし、それは奇妙な動作します。
私はgnu-arm-none-eabiツールチェーンを使用しています。リンカスクリプトコマンドENTRY(asm_start)では効果がありません。リンカスクリプト:
ENTRY(asm_start)
MEMORY
{
RAM : ORIGIN = 0x10000, LENGTH = 0x1000000
PIC_BUFF : ORIGIN = 0x10000 + LENGTH(RAM), LENGTH = 200M
}
SECTIONS
{
.text : {*(.text)} > RAM
.data : {*(.data)} > PIC_BUFF
// etc.
アセンブリ機能:メモリ内のいくつかのランダムな場所に
.text
.global asm_start
.global exc_stack
.global supervisor_sp
asm_start:
# initialize Stack pointer for exception modes
mrs r4, cpsr
bic r4, r4, #0x1f
#FIQ Mode
orr r3, r4, #0x11
msr cpsr_c, r3
ldr sp, =exc_stack
#IRQ Mode
orr r3, r4, #0x12
msr cpsr_c, r3
// etc.
とasm_start終了。
一方、STARTUP()関数はうまく動作し、目的のファイルは.textセクションの適切な場所で終了します。
この場合、正確に何が起こっているのかをご説明ください。
ENTRY()は実行時にPCの開始点を設定し、.text – xvan
で最初にリンクされたオブジェクトをSTARTUP()しているようです。これは本当です。 "あなたのロードされたプログラムの最初のバイト(またはELFとPEバイナリの.textセクションの最初のバイト)になります。"しかし、私のプログラムはELFでもPEバイナリでもありません。どうもありがとう。答えにして、私はそれを受け入れます。 – DawidPi