Funktionen an gewünschte Adresse schieben

Gast #6148912
Als Ergänzung zu meiner vorherigen Frage 
Beitrag "MIPS ISR verschieben"

Ich möchte alle Funktionen bis auf zwei in einen bestimmten 
Speicherbereich schieben.  Ich habe das mit dem Linkerskript nicht 
richtig hinbekommen und hoffe hier auf Hilfe.

Linkerskript:
1
INCLUDE procdefs.ld
2
/* ... */
3

4
SECTIONS
5
{
6
  /* ganz viele Definitionen weggelassen */
7

8
  .text :
9
  {
10
    /* ISR und main sollen als erstes stehen */
11
    *(.text.isr)
12
    *(.text.main)
13
    /* ... */
14
  } >startup_region
15

16
  .text :
17
  {
18
    *(*.text)
19
  } >program1
20

21
  /* noch mehr weggelassene Definitionen */
22
}
Ausschnitt aus procdefs.gld
1
MEMORY
2
{
3
/*kseg0_program_mem     (rx)  : ORIGIN = 0x9D000000, LENGTH = 0x10000*/
4
  startup_region        (rx)  : ORIGIN = 0x9D000000, LENGTH = 0x01000
5
  program1              (rx)  : ORIGIN = 0x9D002000, LENGTH = 0x01000
6
  program2              (rx)  : ORIGIN = 0x9D009000, LENGTH = 0x01000
7
  kseg0_boot_mem              : ORIGIN = 0x9FC00490, LENGTH = 0x970
8
  exception_mem               : ORIGIN = 0x9FC01000, LENGTH = 0x1000
9
  kseg1_boot_mem              : ORIGIN = 0xBFC00000, LENGTH = 0x490
10
  debug_exec_mem              : ORIGIN = 0xBFC02000, LENGTH = 0xFF0
11
  config3                     : ORIGIN = 0xBFC02FF0, LENGTH = 0x4
12
  config2                     : ORIGIN = 0xBFC02FF4, LENGTH = 0x4
13
  config1                     : ORIGIN = 0xBFC02FF8, LENGTH = 0x4
14
  config0                     : ORIGIN = 0xBFC02FFC, LENGTH = 0x4
15
  kseg1_data_mem       (w!x)  : ORIGIN = 0xA0000000, LENGTH = 0x4000
16
  sfrs                        : ORIGIN = 0xBF800000, LENGTH = 0x100000
17
  configsfrs                  : ORIGIN = 0xBFC02FF0, LENGTH = 0x10
18
}

Ziel ist es, alle Funktionen außer isr() und main() in program1 zu 
schieben. program2 soll komplett leer bleiben und wird für ein 
zukünftiges Update reserviert.  Das geht natürlich auch anders, soll 
hier aber so umgesetzt werden.

Das Problem ist, dass das obige Linkerskript alle Funktionen bei 
0x9D002000 beginnen lässt und nicht nur die noch nicht anderweitig 
platzierten.   Ich hab gehofft, dass die Wildcard *(*.text) nur die noch 
nicht anderweitig vergebenen Symbole platziert.  Damit jede Funktion 
Ihre eigene Section bekommt, wird das Projekt mit -ffunction-sections 
kompiliert.

Lässt man die Zeilen .text: {/*...*/} >program1 weg, dann liegen isr() 
und main() da wo sie sollen, allerdings ist der Rest der Funktionen 
nicht da wo ich sie haben möchte.

Kann mir jemand helfen das zu lösen? Ich stehe auf dem Schlauch :(
Gast #6148964
Bauform B. schrieb:
> Zwei output sections mit dem gleichen Namen ist schon mal verdächtig.
> Vielleicht reicht das ja schon.

Wie meinst du das mit "vielleicht reicht das ja schon"?
Ich hab oben ja zwei mal die Output Section .text definiert und so 
funktioniert es leider nicht.
Gast #6148987
MEMORY
{
  kseg0_program_mem    (rx)  : ORIGIN = 0x9D000000, LENGTH = 0x80000
  myprog               (rx)  : ORIGIN = 0xA0014800, LENGTH = 0x0800
  kseg0_boot_mem             : ORIGIN = 0x9FC00490, LENGTH = 0x970
...

SECTIONS
{
  myprog : {
    main.o(.text)
  } > myprog

Musst halt deine ISR in main.o platzieren...
Und die Adressen passend machen.
Gast #6151508
Ich hab das Dilemma jetzt gelöst:
1
SECTIONS
2
{
3
  .program1 :
4
  {
5
    *(*.text.*)
6
  } >program1
7
}

anstatt:
1
SECTIONS
2
{
3
  .program1 :
4
  {
5
    *(*.text)
6
  } >program1
7
}


Danke an alle Beteiligten für die Hinweise!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.