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