Forum: Compiler & IDEs GNU Linker - regelmäßiges Alignment innerhalb einer Sektion


von Michael Dahlke (Gast)


Lesenswert?

Hallo zusammen!

Ich grüble gerade darüber, ob es grundsätzlich möglich ist, per 
Linker-Skript Objekte innerhalb einer Sektion an definierten 
Adressgrenzen abzulegen.

Hintergrund ist, dass ich verschiedene Varianten einer Firmware erzeugen 
möchte, die jeweils einen unterschiedlichen Umfang an einkompilierten 
Datentabellen besitzen sollen. Wenn diese an definierten Adressgrenzen 
liegen, kann ich sie mit vertretbarem Aufwand per "Magic Number" finden.

Der maximale Umfang ist aber im voraus nicht bekannt, ich kann also 
nicht "auf Verdacht" vordefinierte, aber ggf. leere Sektionen im 
Linker-Skript vorsehen, sonst ginge es ja so:
1
  ...
2
  SECTIONS {
3
    ...
4
5
    . = 0x471100;
6
    .dtbl1 ALIGN (0x1000) : {
7
      *(.dtbl01);
8
    } > flash
9
    .dtbl2 ALIGN (0x1000) : {
10
      *(.dtbl02);
11
    } > flash
12
13
    ...
14
  }
15
  ...
Was ich bräuchte, wäre etwas in der Art wie folgender, freilich falscher 
Code:
1
  ...
2
  .tables ALIGN (0x1000) : {
3
    FOR EACH file IN data*.o
4
      . = ALIGN (0x1000);
5
      $file(.datatable);
6
    NEXT
7
  } > flash
8
  ...
Ich hoffe, es wird klar, was gemeint ist. Gibt es überhaupt eine 
Möglichkeit, das zu formulieren? Wenn ja, wie?

Alternativ würde ich pro Tabelle getrennte Sektionen in getrennten 
*.x-Dateien vorsehen und diese per
1
INCLUDE data*.x
 (mit Wildcard, geht das?) in das Linker-Skript einbinden, aber das 
erscheint mir etwas holprig.

Hat jemand eine Idee?


Viele Grüße und schon mal Danke für's Durchlesen,

  Michael

von Andreas B. (andreas_b77)


Lesenswert?

Eventuell könnte man die Sektionen selbst mit dem entsprechenden 
Alignment versehen (sollte ELF unterstützen und wird von ld 
ausgewertet), aber ich konnte jetzt auf Anhieb nichts finden, wie man 
gcc oder as zum manuellen Setzen des Alignments bewegen könnte. Die 
entsprechenden Optionen in objcopy sind laut Doku nur für Windows PE 
Objekte vorgesehen.

von Michael Dahlke (Gast)


Lesenswert?

Hallo Andreas,

in der Richtung hatte ich auch schon geforscht, bin aber auch genau dort 
steckengeblieben.

Aber ich habe gerade eine noch naheliegendere Lösung gefunden:

In den einzelnen Datenfiles (C-Quellen) das Alignment per Typattribut 
setzen und alles in eine benannte Sektion packen. Also so:
1
static const sometable_t
2
__attribute__ ((section (".dtable")))
3
__attribute__ ((aligned (2048)))
4
sometable_8827 = {
5
  ...
6
};
Manchmal ist es so einfach... (an dieser Stelle bitte Hand-vor-die-Stirn 
Geste vorstellen). Mir war nur nicht der Gedanke gekommen, dass man 
aligned auch auf derart große Werte setzen kann. Klar kann man das.


Trotzdem vielen Dank für's Mitgrübeln!

  Michael

von Andreas B. (andreas_b77)


Lesenswert?

Ich würde aber trotzdem noch überprüfen, ob das Alignment dann auch im 
Linker und dann im Endergebnis ankommt. Das obige würde ja nur 
funktionieren, wenn gcc dann auch das Alignment der Sektion ändert.

Übrigens kann man das Attribut "aligned" auch für Datentypen setzen, 
dann muss es nicht bei jeder Variablendeklaration gemacht werden.

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.
Lade...