Autor Thema: Struktur an einer bestimmten Stelle kompilieren  (Gelesen 2185 mal)

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« am: 08. November 2008, 11:18 »
Ich möchte gerne folgendes mit C/C++ Erreichen, und zwar will ich, dass eine Struktur  direkt vor einer Funktion kompiliert wird.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 08. November 2008, 11:30 »
Was meinst du mit "vorher kompiliert"? Kompiliert wird vorher was vorher im Quelltext steht, aber ich nehme nicht an, dass das die eigentliche Frage ist. Was am Ende zuerst in der Objektdatei bzw. in der ausführbaren Datei zuerst steht sind zwei ganz andere Fragen. Ich weiß auch nicht genau was du mit der Struktur an sich meinst. Meinst du wirklich die Definition der Struktur oder die Definition einer Variablen vom Typ der Struktur? Ich tippe ja auf letzteres.

Also: Falls du eine Variablendefinition genau vor einer best. Funktion haben willst, dann ist wohl die einzige wirklich 100%ige Methode mit gcc die Variable in eine eigene Sektion und die Funktion in eine andere eigene Sektion zu packen (über __attribute__((section)) oder so, siehe gcc manual unter c extensions, attributes). Dann die Sections im Linkerscript entsprechend anordnen.
Über Standard-C/C++ kannst du es auf jeden Fall nicht erreichen, da der Compiler und der Linker jedes Recht hat alles zu vertauschen.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 08. November 2008, 12:33 »
Das zweite ist das, hätte mich doch präziser ausdrücken sollen.

Und wie macht man das konkret im Linker Script (ich kenne mich mit dem Linker nicht so aus),
wenn ich z. B. Funktion f und Variable v (die vom Type einer beliebigen Struktur ist) habe?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 08. November 2008, 16:21 »
Die viel interessantere Frage ist... Aus welchem Grund könnte man sowas überhaupt wollen? Ok, Multiboot-Header vielleicht, aber sonst?

Naja, jedenfalls mußt du die Variable wohl in eine andere Section stecken (Geht über irgendein attribute, schau in der gcc-Doku nach) und dann per Linkerskript diese andere Section zuerst ausgeben. Nehme ich jedenfalls an, daß das so geht.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #4 am: 08. November 2008, 18:39 »
Jo, ich halte das von taljeth bzw. wie oben von mir beschriebene für die einzige Möglichkeit. Im Linkerscript dann halt sowas wie:

...
.my_special_data:
{
*(.my_special_data);
}
.my_special_function:
{
*(.my_special_function);
}
...

Unter der Annahme, dass du die Funktion/Daten in die Sektion .my_special_data/code Sektion gesteckt hast natürlich.
Wobei man für die Funktion evtl. keine eigene Sektion braucht, zumindest falls es ausreicht wenn es ausreicht, wenn die Daten vor dem ges. Code (oder einfach komplett am Anfang) sind (wie bei der Multiboot Header z.B.).
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Termite

  • Beiträge: 239
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 08. November 2008, 23:21 »
Sowas geht generlel nur über den Linker.

ist meist vom eingesetzen linker abhángig. und sowas ist selbst im Embeded Bereich, wo man sowas öffter braucht ( z.B. für prüfsummen vor oder nach dem FW Image, Versionsnummern, .... ) ist das nicht immer ganz einfach.

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 11. November 2008, 11:54 »
Ok ich sehe das ist nicht so einfach mit dem Linker, ich löse das glaub ich doch anders.
Trotzdem Danke.   :-)

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #7 am: 11. November 2008, 12:03 »
Schwer ist es eigentlich nicht... ich frag mich nur warum/für was du das überhaupt brauchst? Vielleicht kann man dir ja dann Tipps geben, wie du es anders lösen könntest...
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 17. November 2008, 13:45 »
Also das Problem war, dass ich jeweils eine TSS (oder für Software Multitasking etwas entsprechendes) vor jedem Task anordnen will. Ich geben jetzt einfach 2 Adressen in einer Funktion, die Tasks erstellt mit. Einmal, wo der Task anfängt und die andere Adresse, wo die TSS anfängt. Damit ich das ganze auch leichter Testen kann.

Jetzt hab ich aber doch noch ein Problem und zwar brauch ich, für die Test Funktionen/Tasks auch noch längen. Unter C/C++ weis ich nicht, wie man das von einer Funktion ermitteln kann. Ich weis nicht, ob Gcc das Chronologisch kompiliert, weil bei zwei Funktionen (f1, f2) wobei f1 über f2 sich befindet. Rechne ich das ganze dann so aus: (Wenn das so überhaupt richtig ist)
a = (int*)f2- (int*)f1;doch die Differenz ist viel zu hoch.

Jidder

  • Administrator
  • Beiträge: 1 624
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 17. November 2008, 15:59 »
Die Ausgabe von objdump oder readelf parsen, daraus eine .c/.h-Datei basteln, die du noch dazu linkst. (Ja objdump/readelf, die Kommandozeilenwerkzeuge in deiner Build-Umgebung.) Oder in dein Program libelf linken, und damit das eigene Programm im Speicher parsen. In der Symboltabelle stehts dann im Feld st_size. Oder die c-Dateien erstmal assemblieren (gcc -S), dann befindet sich hinter jeder Funktion eine Zeile in der die Größe berechnet wird. Die suchste mittels eines der Textbearbeitungswerkzeuge deiner Kommandozeilenumgebung, und bastelst noch eine Variable dazu. Oder überdenke dein Konzept und lass die Finger von den Funktionen.
« Letzte Änderung: 17. November 2008, 16:05 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen