Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: Hauke am 08. November 2008, 11:18

Titel: Struktur an einer bestimmten Stelle kompilieren
Beitrag von: Hauke 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.
Titel: Re: Struktur an einer bestimmten Stelle kompilieren
Beitrag von: bluecode 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.
Titel: Re: Struktur an einer bestimmten Stelle kompilieren
Beitrag von: Hauke 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?
Titel: Re: Struktur an einer bestimmten Stelle kompilieren
Beitrag von: kevin 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.
Titel: Re: Struktur an einer bestimmten Stelle kompilieren
Beitrag von: bluecode 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.).
Titel: Re: Struktur an einer bestimmten Stelle kompilieren
Beitrag von: Termite 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.
Titel: Re: Struktur an einer bestimmten Stelle kompilieren
Beitrag von: Hauke 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.   :-)
Titel: Re: Struktur an einer bestimmten Stelle kompilieren
Beitrag von: bluecode 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...
Titel: Re: Struktur an einer bestimmten Stelle kompilieren
Beitrag von: Hauke 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.
Titel: Re: Struktur an einer bestimmten Stelle kompilieren
Beitrag von: Jidder 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.