www.mikrocontroller.net

Forum: Compiler & IDEs Tabellen aus Konstanten in Programm linken?


Autor: Joern (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

in einem Programm moechte ich zwei relativ grosse binaere Tabellen 
(~300KByte pro Tabelle) verwenden und suche nach einer eleganten 
Moeglichkeit diese im Code unterzubringen. Aufgrund der Groesse wuerde 
ich sie ungern in ASCII-Daten umwandeln und als Assemblerdatei 
hinzulinken. Gibt es irgendeine Moeglichkeit, Binaerdateien mit Daten 
direkt in ein Programm zu linken? Und wie gelingt dann elegant eine 
Benennung der Bereiche als Variable? (Bislang ist mir nur eingefallen, 
die an eine feste Adresse zu linken und einen Pointer darauf zu setzen.)

Gruss, Joern

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

GCC?
Dann mit objcopy aus dem Binary eine .o Datei machen:
$ dd if=/dev/random of=test.bin bs=1024 count=1024
$ objcopy -I binary -O elf32-little test.bin test.o
$ objdump.exe -t test.o 

test.o:     file format elf32-little

SYMBOL TABLE:
00000000 l    d  .data  00000000 .data
00000000 g       .data  00000000 _binary_test_bin_start
00100000 g       .data  00000000 _binary_test_bin_end
00100000 g       *ABS*  00000000 _binary_test_bin_size


Das entstandene .o kannst du dann dazulinken und mittels der Symbole 
_binary_test_bin_* darauf zugreifen:
uint8_t* p;

p = &_binary_test_bin_start;

while(p != &_binary_test_bin_end)
{
  doSomething(*p++);
}

Mittels --redefine-sym kannst du mit objcopy auch noch die Symbolnamen 
ändern.

Matthias

Autor: Joern (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke erstmal, Dein Tipp hat anfaenglich tatsaechlich geholfen, nur 
stehe ich damit nun vor einem neuen Problem. Leider habe ich gerade die 
Ausgabe des Linkers nicht vorliegen, aber sie ist sinngemaess, dass das 
Alignment der Variable in test.o (in Deinem Beispiel) 1 ist und damit 
kleiner als in main.o (wo ich den Pointer _binary_test_bin_start 
verwende) wo es 4 ist. Wie bekomme ich das behoben? Zusaetzlich ist die 
architecture der datei test. o unbekannt und es ist mir auch leider 
nicht gelungen die architecture mit der -B - Option in objcopy zu 
aendern. Das beides sind nur Warnungen und ich wuerde mich nicht darum 
kuemmern, stuerzte das Programm nicht immer ab, wenn ich den Pointer zu 
verwenden versuche. (Alignment-Fehler? Eigentlich sollten die Adressen 
trotzdem zum 4Byte Alignment taugen)

Gruss, Joern

Autor: Joern (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wollte noch mal den genauen Wortlaut der Warnmeldung nachtragen:
bfin-elf-ld: Warning: alignment 1 of symbol `_undistort_left_start' in undistort
_left.o is smaller than 4 in main.o

bfin-elf-ld: warning: unknown architecture of input file `undistort_left.o' is i
ncompatible with bfin output

Gruss, Joern

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

definiere bitte mal deinen Compiler etwas exakter. Es scheint ja ein GCC 
zu sein aber für welche Architektur? Wenn ich raten müßte würde ich auf 
ARM tippen.

Wie greifst du auf die Daten zu? Sourcecode! Ich hab diese Methode schon 
erfolgreich bei Architekturen mit striktem Alignment eingesetzt.

Matthias

Autor: Joern (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wahr, ein paar Worte zur Architektur waeren wahrscheinlich nicht 
verkehrt gewesen. Du liegst aber falsch, ich verwende einen Blackfin.

Die Object-Datei erzeuge ich wie folgt aus einer Datei (die einen 
Integer-String enthaelt):
bfin-elf-objcopy -I binary -O elf32-little --readonly-text --redefine-syms symbols.txt undistort_right.dat undistort_right.o

In geistiger Umnachtung habe ich bislang darauf (nach Umbenennung) wie 
folgt zugegriffen:
unsigned int * undistort_left_start;
unsigned int * undistort_right_start;

Das habe ich mittlerweile in
extern unsigned int undistort_left_start[];
extern unsigned int undistort_right_start[];

geaendert, was zumindest den ersten Fehler beim Kompilieren behebt. 
Ausprobieren konnte ich leider noch nicht ob es auch den Fehler beim 
Ausfuehren behebt, weil ich mein Board gerade nicht da habe. Bin da aber 
ganz guter Hoffnung.
Bleibt nur noch der zweite Fehler, von dem ich fuerchte, er koenne 
ziemlich Compiler-spezifisch sein.
Vielleicht hat aber dennoch jemand ne Idee, waere ne eins.

Gruss, Joern

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

versuch mal
bfin-elf-objcopy -I binary -O elf32-bfin --readonly-text --redefine-syms symbols.txt undistort_right.dat undistort_right.o

Du kannst auch mal schauen was deine anderen Objekte (die aus .c 
erstellten) für ein Format haben:
bfin-elf-objdump -a test.o

Daraus kannst du dann evtl. das Target für den objcopy Aufruf ableiten.

Matthias

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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