Feste Adressen in gnu ld

Gast #7253770
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
Angehängte Dateien:
Gast #7254972
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?
#7254990
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
Gast #7255049
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?
#7255110
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
#7255128
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.
#7255180
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.
Gast #7255785
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!
#7255795
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
Gast #7260822
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 :).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren