mikrocontroller.net

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


Autor: Ulf Rolf (roolf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe für den mega8 einen Bootloader und will am Ende die Applikation 
ab Adresse 0 starten.  Der Bootloader wird mit
BLSTART = 0x1f00

   avr-ld -Ttext $(BLSTART) ...
gelinkt.  Wenn ich nun testweise an den Anfang des Bootloaders die 
Anweisungen
   .section .text
   rjmp 0              ; starte bei 0
schreibe, dann funktioniert das nicht.  Im Dissasembler sehe ich auch, 
warum:
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
   .section .absolute
   .org 0
bls:  

   .section .text

   rjmp bls             ; starte bei 0
ist erfolgreich:
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?

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Ulf Rolf (roolf)
Datum:

Bewertung
0 lesenswert
nicht 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.ä.).

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Ulf Rolf (roolf)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 ((void(*)(void))(char *)0x0000)();
  48:   e0 e0           ldi     r30, 0x00       ; 0
  4a:   f0 e0           ldi     r31, 0x00       ; 0
  4c:   09 95           icall


Peter

Autor: Ulf Rolf (roolf)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.