2016-05-31 7 views
0

Ich bin ein wenig verwirrt mit ENTRY und STARTUP-Befehle in GCC-Linker-Skript.Link-Funktion zu einer bestimmten Adresse

Wie hier angegeben: http://wiki.osdev.org/Linker_Scripts

ENTRY() macht jedes Symbol als erstes Element in .text Abschnitt verknüpft werden. STARTUP() hingegen macht die ganze kompilierte Datei als erstes Element im .text-Abschnitt platziert.

In meinem Projekt verhält es sich jedoch seltsam.

Ich benutze gnu-arm-none-eabi toolchain und in meinem Linker-Skript Befehl ENTRY (asm_start) macht keinen Effekt. Linker-Skript:

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. 

Montage Funktion:

.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. 

und asm_start endet in einem zufälligen Ort im Speicher.

Auf der anderen Seite funktioniert STARTUP() Funktion gut und gewünschte Datei endet an der richtigen Stelle in. Text Abschnitt.

Könnte man bitte erklären, was genau in diesem Fall passiert?

+0

Ich bin mir nicht 100% sicher, aber sieht aus wie ENTRY() ist der PC Startpunkt bei der Ausführung, und STARTUP() das erste verknüpfte Objekt in der .text – xvan

+0

oh, das ist so wahr. "sei das allererste Byte deines geladenen Programms (oder das erste Byte des .text-Abschnitts in ELF- und PE-Binärdateien)", aber mein Programm ist weder ELF- noch PE-Binärdatei. Danke vielmals. Mach es als Antwort und ich werde es akzeptieren. – DawidPi

Antwort

1

ENTRY() setzt den PC Startpunkt auf der Ausführung und das erste STARTUP() verknüpftes Objekt in den .text

BTW, für baremental cortex ARM gnu-arm-none-eabi wird ENTRY() üblicherweise das Reset_Handler Vektor gesetzt und .text muss beginnen mit der Interrupt-Vektortabelle.

Ich habe es immer manuell eingestellt gesehen. aber es könnte möglich sein, STARTUP() dafür zu verwenden.

Verwandte Themen