2016-05-31 6 views
0

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セクションの適切な場所で終了します。

この場合、正確に何が起こっているのかをご説明ください。

+0

ENTRY()は実行時にPCの開始点を設定し、.text – xvan

+0

で最初にリンクされたオブジェクトをSTARTUP()しているようです。これは本当です。 "あなたのロードされたプログラムの最初のバイト(またはELFとPEバイナリの.textセクションの最初のバイト)になります。"しかし、私のプログラムはELFでもPEバイナリでもありません。どうもありがとう。答えにして、私はそれを受け入れます。 – DawidPi

答えて

1

ENTRY()は、実行上のPCの開始点を設定し、ところで、baremental皮質のARM gnu-arm-none-eabiため、ENTRY()は通常Reset_Handlerベクトルと.textに設定されているの.text

STARTUP()最初のリンクされたオブジェクトを起動する必要があります割り込みベクタテーブルを使用します。

私はいつも手動で設定しています。それにはSTARTUP()を使用することは可能かもしれません。

関連する問題