Forum: Compiler & IDEs rjmp 0 relocatet sein Argument (oder: wie nutze ich .absolute-Section?)


von Ulf R. (roolf)


Lesenswert?

Ich habe für den mega8 einen Bootloader und will am Ende die Applikation 
ab Adresse 0 starten.  Der Bootloader wird mit
1
BLSTART = 0x1f00
2
3
   avr-ld -Ttext $(BLSTART) ...
gelinkt.  Wenn ich nun testweise an den Anfang des Bootloaders die 
Anweisungen
1
   .section .text
2
   rjmp 0              ; starte bei 0
schreibe, dann funktioniert das nicht.  Im Dissasembler sehe ich auch, 
warum:
1
1f00:       ff cf           rjmp    .-2             ; 0x1f00 <__ctors_end>
Die Adresse in rjmp 0 wird offenbar relativ zur section genommen.

Wie kann ich die Adresse absolut bekommen?

Der Versuch mit
1
   .section .absolute
2
   .org 0
3
bls:  
4
5
   .section .text
6
7
   rjmp bls             ; starte bei 0
ist erfolgreich:
1
1f00:       7f c0           rjmp    .+254           ; 0x2000 <__data_load_end>
es erscheint mir aber wegen des .org-Befehls etwas umständlich.  Kann 
ein Label nicht mit einfacheren Mitteln "absolut" gemacht werden?

von Stefan E. (sternst)


Lesenswert?

Du könntest ein undefiniertes Symbol nehmen, und dieses in der 
Linker-Kommandozeile mit 0 definieren.
1
rjmp abs_null
1
--defsym=abs_null=0

von Ulf R. (roolf)


Lesenswert?

Stefan Ernst schrieb:
> Du könntest ein undefiniertes Symbol nehmen,

das mag im konkreten Fall mit 0 funktionieren, mich interessiert aber 
auch eine grundsätzliche Lösung (z.B. Aufbau einer Sprungtabelle o.ä.).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ulf Rolf schrieb:
> Kann
> ein Label nicht mit einfacheren Mitteln "absolut" gemacht werden?

Nein, natürlich nicht.  Schließlich hast du einen Linker vor dir,
der verschiebliche Segmente zusammenfügen will.  Absolute Adressen
können und dürfen daher erst zur Linkzeit vorgegeben werden, entweder
über Linkerscript oder die Kommandozeile.  .org ist ein Relikt aus
Zeiten der Absolutassembler.  Eigentlich sollte man diese Direktive
streichen. ;-)

von Ulf R. (roolf)


Lesenswert?

Jörg Wunsch schrieb:

> Nein, natürlich nicht.  Schließlich hast du einen Linker vor dir,
> der verschiebliche Segmente zusammenfügen will.  Absolute Adressen
> können und dürfen daher erst zur Linkzeit vorgegeben werden, entweder
> über Linkerscript oder die Kommandozeile.  .org ist ein Relikt aus
> Zeiten der Absolutassembler.  Eigentlich sollte man diese Direktive
> streichen. ;-)

Hm.  Wie geht das konkret?  Mein Beispiel:

Angenommen, ich habe einen Bootloader und dort ein paar 
Lowlevel-Routinen, die ich zukünftig auch von der Applikation aus 
starten möchte.  Dann muss ich also (a) beim Assemblieren/Linken des 
Bootloaders die Symboltabelle für die Einsprungadressen auswerten und 
(b) beim Assemblieren/Linken der Applikation diese Adressen 
bekanntmachen.  Immer wenn sich die Implementierung der 
Lowlevel-Routinen ändert, verschieben sich alle Adressen, und die 
Applikation läuft nicht mehr, bis sie neu übersetzt wird.

Klassischerweise hat man daher bei solchen "Libraries" eine Tabelle mit 
Einsprungadressen (RJMP-Befehle), deren Ort selbst fest ist.  Wie würde 
ich nun diese festen Einsprungadressen der Applikation so bekanntmachen, 
dass sie der Linker als nicht relozierbar behandelt?  Es würde mich 
wundern, wenn ich nun mit sed die Symboltabelle parsen muss, um daraus 
eine Latte von "--defsym"-Optionen für mein Makefile zu erzeugen?

von Stefan E. (sternst)


Lesenswert?

Jörg Wunsch schrieb:
> Ulf Rolf schrieb:
>> Kann
>> ein Label nicht mit einfacheren Mitteln "absolut" gemacht werden?
>
> Nein, natürlich nicht.  Schließlich hast du einen Linker vor dir,
> der verschiebliche Segmente zusammenfügen will.  Absolute Adressen
> können und dürfen daher erst zur Linkzeit vorgegeben werden, entweder
> über Linkerscript oder die Kommandozeile.

Es geht schon auch im Source, denn genau dafür ist die .absolute-Section 
ja da. Die dafür nötigen zwei Zeilen sind ihm ja aber schon zu 
umständlich.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ulf Rolf schrieb:
> Wie würde
> ich nun diese festen Einsprungadressen der Applikation so bekanntmachen,
> dass sie der Linker als nicht relozierbar behandelt?

Beitrag "Re: Bootloader und Applikation gemeinsam Compilieren"

von Stefan E. (sternst)


Lesenswert?

Ulf Rolf schrieb:
> Klassischerweise hat man daher bei solchen "Libraries" eine Tabelle mit
> Einsprungadressen (RJMP-Befehle), deren Ort selbst fest ist.  Wie würde
> ich nun diese festen Einsprungadressen der Applikation so bekanntmachen,
> dass sie der Linker als nicht relozierbar behandelt?  Es würde mich
> wundern, wenn ich nun mit sed die Symboltabelle parsen muss, um daraus
> eine Latte von "--defsym"-Optionen für mein Makefile zu erzeugen?

Bei einer Tabelle geht es doch bloß um eine Ádresse, nämlich die der 
Tabelle selbst. Diese eine Adresse machst du der Applikation einfach per 
--defsym bekannt.

von Peter D. (peda)


Lesenswert?

1
 ((void(*)(void))(char *)0x0000)();
2
  48:   e0 e0           ldi     r30, 0x00       ; 0
3
  4a:   f0 e0           ldi     r31, 0x00       ; 0
4
  4c:   09 95           icall


Peter

von Ulf R. (roolf)


Lesenswert?

Stefan Ernst schrieb:

> Es geht schon auch im Source, denn genau dafür ist die .absolute-Section
> ja da. Die dafür nötigen zwei Zeilen sind ihm ja aber schon zu
> umständlich.

Nicht zu umständlich - sondern ich war mir nicht sicher, ob mein obiger 
Ansatz der empfohlene ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.