mikrocontroller.net

Forum: Compiler & IDEs ld: Sections eines Objects innerhalb einer library an bestimmte Adresse linken


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: TuNichtGut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich baue in einem Projekt eine CMSIS Library.
Jetzt habe ich unterschiedlich schnelle Speicherbereiche.

Startup -> soll in den langsamen Teil
Alles andere -> passt dann gerade noch so in den schnellen Teil:
SECTIONS
{
  .text_DDR_startup : /*ONLY_IF_RO /* see initial ATTENTION! */
  {
    KEEP(*(.vectors))
    *libCMSIS.a:*startup_ARM_CM3.S.obj(.text)
    /**libCMSIS.a:(.text)*/
  } > SLOW_MEM

...
}
Das wäre jetzt das korrekte Handling nach meinem Verständnis gewesen.
Er zieht aber nicht die Section raus.

Mit auskommentieren vom *libCMSIS.a:(.text*) funktioniert es, aber dann 
liegt mehr in dem langsamen Bereich als soll.
Wer kann mich schnell bezüglich meines Syntax Fehlers/Verständins 
Problems aufklären?

Wenn ich mir das *.a File genauer mit objdump und readelf anschaue, 
scheint eine Zuteilung aufgrund des ürspringlichen *.obj-Files ja noch 
möglich zu sein!?

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vermutlich hast du irgendwo ein *(.text) für den schnellen Speicher? 
Dies hat dann wahrscheinlich Priorität. Verschiebe die Section für den 
schnellen Speicher mal hinter den für den langsamen...

Autor: TuNichtGut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles davor im Script:
[avrasm]
MEMORY
{
  SLOW_MEM (rx)  :  ORIGIN = 0x00000000, LENGTH = 2048M
  FAST_MEM (rx)  :  ORIGIN = 0x10000000, LENGTH = 64K
  RAM (rw)       :  ORIGIN = 0x20000000, LENGTH = 128K
}


/* Linker script to place sections and symbol values.
 * It references following symbols, which must be defined in code:
 *   Reset_Handler : Entry of reset handler
 *
 * It defines following symbols, which code can use without definition:
 *   __exidx_start
 *   __exidx_end
 *   _copy_table_start_
 *   _copy_table_end_
 *   _zero_table_start_
 *   _zero_table_end_
 *   __etext
 *   _data_start_
 *   __preinit_array_start
 *   __preinit_array_end
 *   __init_array_start
 *   __init_array_end
 *   __fini_array_start
 *   __fini_array_end
 *   _data_end_
 *   _bss_start_
 *   _bss_end_
 *   _end_
 *   end
 *   __HeapLimit
 *   __StackLimit
 *   __StackTop
 *   __stack
 */

ENTRY(Reset_Handler)

Autor: TuNichtGut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht noch aus dem readelf output:
File: ./libCMSIS.a(startup_ARMCM3.S.obj)
There are 24 section headers, starting at offset 0x1ddc:
  [Nr] Name
       Type            Addr     Off    Size   ES   Lk Inf Al
       Flags
  [ 0] 
       NULL            00000000 000000 000000 00   0   0  0
       [00000000]: 
  [ 1] .text
...


Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch mal "libCMSIS.a(.text)" und "libCMSIS.a(.text*)", ohne führendes 
Sternchen.

Autor: TuNichtGut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niklas G. schrieb:
> Versuch mal "libCMSIS.a(.text)" und "libCMSIS.a(.text*)", ohne führendes
> Sternchen.

?
"*libCMSIS.a:(.text)" funktioniert ja für die ganze Lib.
Nur da sind halt auch Sachen drin, die zur Laufzeit in relevantem Maße 
aufgerufen werden und dann auch im langsamen Speicher liegen.
...
Ich kann natürlich umbauen, dass keine Lib gebaut wird. Aber eigentlich 
sollte das hier doch ganz einfach funktionieren. Kann doch nicht sein 
grr.

Aber schon mal danke fürs draufschauen!

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TuNichtGut schrieb:
> "*libCMSIS.a:(.text)" funktioniert ja für die ganze Lib.
> Nur da sind halt auch Sachen drin, die zur Laufzeit in relevantem Maße
> aufgerufen werden und dann auch im langsamen Speicher liegen.

Und wo/wie wählst du die kritischen Sachen aus, die im schnellen 
Speicher landen sollen? Das müsste dann vor diesem "Catch-All" stehen. 
Oder willst du die gesamte CMSIS im schnellen Speicher haben?

: Bearbeitet durch User
Autor: TuNichtGut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... ist ja eigentlich egal ob ich mir zuerst den kleinen langsamen Teil 
rauspicke, oder den schnellen Teil. Solange ich zu doof für die 
scheinbar richtige Syntax bin :(.

Aktuell passt alles gerade so rein, wenn ich nur die paar Bytes Startup 
rausschmeiße ;).

Alles danach funktioniert Problemlos, da ich dann für .text nur noch ein
.text :
  {
    __data2_start__ = .;
    *(.text*)
     *(.rodata*)

    KEEP(*(.eh_frame*))
    __data2_end__ = .;
  } > FAST_MEM AT SLOW_MEM
mache. Davor ist noch der ganze C++ kram mit den Konstruktor/Destruktor, 
Stackunwinding und so Kram der nicht verwendet wird. Basiert auf einem 
ARM Beispiel, hier wird nur C verwendet.

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TuNichtGut schrieb:
> ... ist ja eigentlich egal ob ich mir zuerst den kleinen langsamen Teil
> rauspicke, oder den schnellen Teil

Ja, aber mit "libCMSIS.a:(.text)" pickst du nicht den langsamen Teil 
raus, sondern nimmst alles in den langsamen Speicher. Wenn du danach 
versuchst etwas schnelles heraus zu picken, klappt das nicht (wird 
ignoriert).


TuNichtGut schrieb:
> Solange ich zu doof für die
> scheinbar richtige Syntax bin :(.

Ich glaube nicht dass die Syntax der Fehler ist. Die Anweisungen müssen 
in der richtigen Reihenfolge kommen.

TuNichtGut schrieb:
> Ich kann natürlich umbauen, dass keine Lib gebaut wird.

Das ändert auch nichts. Auch hier ist die Reihenfolge wichtig.

Woher soll der Linker wissen was schnell ist und in den schnellen 
Speicher soll?

: Bearbeitet durch User
Autor: TuNichtGut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niklas G. schrieb:
> TuNichtGut schrieb:
>> ... ist ja eigentlich egal ob ich mir zuerst den kleinen langsamen Teil
>> rauspicke, oder den schnellen Teil
>
> Ja, aber mit "libCMSIS.a:(.text)" pickst du nicht den langsamen Teil
> raus, sondern nimmst alles in den langsamen Speicher. Wenn du danach
> versuchst etwas schnelles heraus zu picken, klappt das nicht (wird
> ignoriert).
>
> Woher soll der Linker wissen was schnell ist und in den schnellen
> Speicher soll?

Aber ja "nur" von der gebauten CMSIS Lib.
War auch nur der Test, ob ich da was komplett verkehrt mache.
Deswegen will ich ja eigentlich über den spezifischeren Pfad:
"./libCMSIS.a:startup_ARM_CM3.S.obj"(.text)
gehen.
Allerdings klappt das ja nicht. Dabei verstehe ich die Doku so, ...
och miste!
ld Doku: "For instance, you cannot extract a from an archive by using "archive:file" in an INPUT command."
 :(

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, jetzt verstehe ich es erst. Nur "startup_ARM_CM3.S.obj" aus der 
CMSIS soll in den langsamen, der ganze Rest in den schnellen Speicher?

TuNichtGut schrieb:
> ld Doku: "For instance, you cannot extract a from an archive by using
> "archive:file" in an INPUT command."

Das ist dann doof. Du kannst mit ".section" den Startup-Code in eine 
spezielle Section packen, und die dann mit *(.StartupCode) o.ä. in den 
langsamen Speicher übernehmen.

Autor: TuNichtGut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niklas G. schrieb:
> Ach, jetzt verstehe ich es erst. Nur "startup_ARM_CM3.S.obj" aus
> der
> CMSIS soll in den langsamen, der ganze Rest in den schnellen Speicher?
>
> TuNichtGut schrieb:
>> ld Doku: "For instance, you cannot extract a from an archive by using
>> "archive:file" in an INPUT command."
>
> Das ist dann doof. Du kannst mit ".section" den Startup-Code in eine
> spezielle Section packen, und die dann mit *(.StartupCode) o.ä. in den
> langsamen Speicher übernehmen.

Genau!

So werd ich es wohl machen (müssen). Oder halt das ganze vorab nicht 
zusammenpacken. Aber das ist nicht mein Bereich ;), da mische ich mich 
jetzt nicht mehr ein.

Aber noch Danke!

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.

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