Forum: PC-Programmierung Feste Adressen in gnu ld


von Johannes (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich habe ein Assembler-Programm (68k) geschrieben, das aus drei Teilen 
besteht: Bootloader + Anwendung + Selbsttest. Nun möchte ich gerne jeden 
Teil an eine bestimmte Adresse legen:
1
0x00100 Bootloader
2
0x10000 Anwendung
3
0xA0000 Selbsttest

Kann mir bitte jemand sagen, wie ich das in GNU ld machen kann? 
Offensichtlich geht das per Linker Script (mein Default Script ist im 
Anhang). Was muss ich dort anpassen?

Grüße
Johannes

von Oliver S. (oliverso)


Lesenswert?

Reicht da nicht ein einfaches .org 0x42 im Programmcode?

Oliver

von Bauform B. (bauformb)


Lesenswert?

In so einem Fall mache ich daraus 3 eigenständige Programme mit jeweils 
einer anderen Basisadresse. Die 3 Hex-Dateien müssen/können dann einzeln 
programmiert werden. Falls der Programmspeicher sektorweise gelöscht 
werden kann, kann ich die auch einzeln updaten.

von Johannes (Gast)


Lesenswert?

Oliver S. schrieb:
> Reicht da nicht ein einfaches .org 0x42 im Programmcode?

Leider nein.


Bauform B. schrieb:
> In so einem Fall mache ich daraus 3 eigenständige Programme mit jeweils
> einer anderen Basisadresse.

Das ist ein guter Workaround. Aber es muss doch auch eine richtige 
Lösung geben!


Kennt sich jemand mit gnu ld aus und hat jemand eine Idee?

von Johannes (Gast)


Lesenswert?

Das scheint ja eine harte Nuss zu sein. Eigentlich ist die ja Aufgabe 
trivial, aber bei der Suche nach einer Lösung, wurde gleich auf das 
Linker-Script verwiesen und das ist leider nicht gerade selbsterklärend.

Gibt es denn niemanden, der sich mit dem Linker gut auskennt?

von Oliver S. (oliverso)


Lesenswert?

Johannes schrieb:
> Oliver S. schrieb:
>> Reicht da nicht ein einfaches .org 0x42 im Programmcode?
>
> Leider nein.

Begründung?

Ansonsten braucht es mehr Details. Sind das drei völlig eigenständige 
Programme, oder ist das ein Programm mit mehren Einsprungfunktionen? Wo 
sollen die Daten hin?

Johannes schrieb:
> aber bei der Suche nach einer Lösung, wurde gleich auf das
> Linker-Script verwiesen und das ist leider nicht gerade selbsterklärend.

Das ist aber nun mal die richtige Stelle, um dem linker die Verteilung 
von Code und Daten im Speicher vorzugeben.

Eine andere gibt es nicht.

Oliver

von Johannes (Gast)


Lesenswert?

Oliver S. schrieb:
> Begründung?

https://stackoverflow.com/questions/31479054/is-there-something-like-org-for-nasm-in-gas

Oliver S. schrieb:
> Ansonsten braucht es mehr Details. Sind das drei völlig eigenständige
> Programme, oder ist das ein Programm mit mehren Einsprungfunktionen? Wo
> sollen die Daten hin?

Sie sind logisch in sich abgeschlossen, gehören semantisch aber 
zusammen. Es gibt Sprünge zwischen den Teilen. So, wie man es von einem 
ganz normalen Bootloader her kennt.

Meinst Du mit "Daten" die Konstanten?

Oliver S. schrieb:
> Das ist aber nun mal die richtige Stelle, um dem linker die Verteilung
> von Code und Daten im Speicher vorzugeben.

Das glaube ich Dir aufs Wort. Aber meine Frage ist ja, wie ich das 
mache. Kannst Du mir da weiterhelfen? Was muss ich im Linker-Script 
abändern?

von Oliver S. (oliverso)


Lesenswert?

Johannes schrieb:
> Oliver S. schrieb:
>> Begründung?
>
> 
https://stackoverflow.com/questions/31479054/is-there-something-like-org-for-nasm-in-gas

Selbst schon ausprobiert? Es ist zwar richtig, daß .org die location nur 
nach vorne verlagern kann, aber die generelle Aussage dort, daß es wie 
beim NASM nicht mehr als einmal verwendet werden kann, ist falsch

https://ftp.gnu.org/old-gnu/Manuals/gas-2.9.1/html_chapter/as_7.html#SEC112

Im avr-as zumindest klappt das völlig problemlos. Was dein 68k-as daraus 
macht, keine Ahnung. Meine 68k-Zeiten waren im letzten Jahrtausend. Das 
ist aber doch schnell getestet.

Oliver

von Bauform B. (bauformb)


Lesenswert?

Johannes schrieb:
> Was muss ich im Linker-Script abändern?

Vielleicht (ja, nur ganz vielleicht) ist das das Problem. Also, das 
Script war mal für etwas völlig anderes gebaut worden und ist dann 42 
mal abgeändert worden? Als jemand, der keine Ahnung vom ld hat, finde 
ich, dass ein Script für dieses Programm viel kürzer sein sollte.

Aus dem Grund hatte ich für meine uC-Programme das Script komplett neu 
gebaut, angefangen bei Null. Und jetzt sieht es völlig anders aus als 
deins, gerade mal das SECTION statement habe ich noch wiedererkannt ;)

Was ich nur sagen will: es könnte evt. einfacher sein, bei Null 
anzufangen.

von J. S. (jojos)


Lesenswert?

so aufwändig habe ich das auch noch nicht gesehen, warum sind da z.B. 
die ganzen debug sections drin? Die habe ich beim Cortex-M auch so im 
.elf drin.

Ich kenne das so das erstmal mit MEMORY die vorhandenen Speicherbereiche 
festgelegt werden, für Bootloader und App sind diese dann verschieden.
1
MEMORY
2
{
3
    FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 0x20000
4
    RAM (rwx) : ORIGIN = 0x20000000 + (((48 * 4) + 7) & 0xFFFFFFF8), LENGTH = 0x9000 - (((48 * 4) + 7) & 0xFFFFFFF8)
5
}

Ram ist hier nur verschoben weil da die Vectortabelle liegt. Mit der 
Flashstartadresse wäre das der Bootloader, die App liegt dann mit einem 
Offset dahinter.
Die Sections die danach folgen werden dann in die Memorybereiche gelegt.
1
ENTRY(Reset_Handler)
2
SECTIONS
3
{
4
    .text :
5
    {
6
        KEEP(*(.isr_vector))
7
        *(.text*)
8
        KEEP(*(.init))
9
        KEEP(*(.fini))
10
        *crtbegin.o(.ctors)
11
        *crtbegin?.o(.ctors)
12
        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
13
        *(SORT(.ctors.*))
14
        *(.ctors)
15
        *crtbegin.o(.dtors)
16
        *crtbegin?.o(.dtors)
17
        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
18
        *(SORT(.dtors.*))
19
        *(.dtors)
20
        *(.rodata*)
21
        KEEP(*(.eh_frame*))
22
    } > FLASH

Aus dem Linkerfile können noch Symbole exportiert werden die dann im 
Code verwendet werden können, um nicht zwei Stellen zu haben die manuell 
gleich gehalten werden müssen.

: Bearbeitet durch User
von Johannes (Gast)


Lesenswert?

Oliver S. schrieb:
> Selbst schon ausprobiert? Es ist zwar richtig, daß .org die location nur
> nach vorne verlagern kann, aber die generelle Aussage dort, daß es wie
> beim NASM nicht mehr als einmal verwendet werden kann, ist falsch

Ja, er gibt dann folgende Fehlermeldung aus: "MRI style ORG pseudo-op 
not supported".



Bauform B. schrieb:
> Als jemand, der keine Ahnung vom ld hat, finde
> ich, dass ein Script für dieses Programm viel kürzer sein sollte.

J. S. schrieb:
> so aufwändig habe ich das auch noch nicht gesehen, warum sind da z.B.
> die ganzen debug sections drin?

Das ist das Default Linker-Script, dass ld ausgibt, wenn man es mit dem 
Parameter "-verbose" startet. Dass es so komplex ist, überrascht mich 
ebenfalls.


J. S. schrieb:
> Ich kenne das so das erstmal mit MEMORY die vorhandenen Speicherbereiche
> festgelegt werden, für Bootloader und App sind diese dann verschieden.

Danke, ich werde das gleich ausprobieren!

von Oliver S. (oliverso)


Lesenswert?

Johannes schrieb:
> Das ist das Default Linker-Script, dass ld ausgibt, wenn man es mit dem
> Parameter "-verbose" startet. Dass es so komplex ist, überrascht mich
> ebenfalls.

Das ist ein linkerscript für die C/C++-Toolchain. Die allermeisten Dinge 
da drin brauchst du für ein reines Assemblerprogramm nicht.

Das .org nicht funktioniert, liegt anscheinend am MRI-Mode.

https://web.mit.edu/rhel-doc/3/rhel-as-en-3/m.html

Wenn du keine Möglichkeit hast, den zu vermeiden, gehst halt damit 
nicht.

Oliver

: Bearbeitet durch User
von ... (Gast)


Lesenswert?

Ich hab das fuer den PIC32/MIPS mit dem Linkerscript schon
hinbekommen. Da ging es bei mir darum, Code und Daten
auf eine bestimmte Adresse(n) im RAM zu legen.

Man muss fuer diese Teile dann eigene Scctions oder waren es
Regions(?) anlegen.

Ich guck mal ob ich das noch finde :).

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.