Forum: Mikrocontroller und Digitale Elektronik CMD Limit unter Windows GCC-Linkeraufruf


von EL (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein Problem und weis momentan nicht wie ich es richtig angehen 
soll.

Es geht um den Linkeraufruf meiner Projekte. Bisher bin ich immer gut 
klargekommen.

Setup:

Windows. Linux ist leider keine Option.
Eclipse
GNU ARM Toolchain
Platformen sind unterschiedliche STM32-Cortex Derivate

Das Kernproblem ist nicht mein Projekt sondern Windows. Eclipse ruft die 
Buildtools per Kommandozeilenbefehl auf.
Zunächst habe ich die Grenze von 81xx Zeichen als Übergabeparameter 
erreicht. Damals lief alles über den internen CDT Build.

Damals habe ich dann die unten beschriebenen Buildtools verwendet und 
somit zunächst mein Problem behoben.

https://mcuoneclipse.com/2015/03/29/solving-the-8192-character-command-line-limit-on-windows/

Was ich damals nicht wusste, ist das Windows aus irgendwelchen Gründen 
ein absolutes Call Limit für jedwelche Aufrufe hat (100% bin ich mir 
nicht sicher). Bei 31k Zeichen geht auf jeden fall garnichts mehr. :-( 
Eclipse ruft den linker jetzt zwar über die Buildtools auf
aber übergibt nach wie vor alle Objektfiles zusammen als einzelnen 
Parameter. Aufgrund von Windows ist
daher bei ca. 31k Zeichen tutti. Es kommt zum Programmfehler und der 
Linkprozess schlägt fehl.

Es gibt jetzt mehrere Möglichkeiten um das Problem zu lösen. Wie gesagt, 
Linux ist nicht möglich.

1. Vielleicht muss muss ich mich jetzt intensiv mit Makefiles 
beschäftigen. Ich finde das Thema aber ziemlich öde und muss
sagen, dass ich es echt angenehm fand, dass eclipse mir das abnimmt.
Da wird ja ein makefile generiert und anhand dessen der erstellt.

2. Ein Problem dabei ist sicherlich auch, dass die Ordnerhirachie beim 
erstellen der Objectfiles genau gleich ist wie
beim Projekt und sich deshalb die Aufrufe verlängern (Die Pfade werden 
aus dem Root zusammengebaut).
Vielleicht bekomme ich es hin, dass alle Objects in einen Ordner 
geschmissen werden...?

Was ich auf keinen Fall möchte, ist jedes mal wenn das Projekt wächst 
irgendwas hinzufügen...
Kennt jemand für Make eine gute Hilfe  Buch  Tips wie ich das Thema am 
schnellsten reinbekomme?
Vielleicht gibts auch Tools die von Eclpise unterstützt werden?

3. Ich könnte große Module in Libs packen. Aber auch da komme ich an die 
Grenzen z.B. wenn ich externe Grafikbibliotheken einbinden will..

Gibt es vielleicht noch andere Möglichkeiten? Wie löst ihr dieses 
Problem unter Windows?

Vielen Dank für eure Anregungen. Falls noch Infos fehlen kann ich die 
Gerne noch nachreichen...

Grüße
EL

von Dr. Sommer (Gast)


Lesenswert?

Man kann die zu linkenden Object Files auch per Linkerscript übergeben. 
Das könntest du dann automatisch aus den vorhandenen Sourcefiles 
generieren...

von Peter II (Gast)


Lesenswert?

EL schrieb:
> 2. Ein Problem dabei ist sicherlich auch, dass die Ordnerhirachie beim
> erstellen der Objectfiles genau gleich ist wie
> beim Projekt und sich deshalb die Aufrufe verlängern (Die Pfade werden
> aus dem Root zusammengebaut).

kannst du sie nicht relativ zum makefile angeben?

Wenn die anfangs Hierarchie überall gleich ist, könnte man auch für den 
Ordner einen Laufwerksbuchstaben vergeben.

von EL (Gast)


Lesenswert?

Hallo Dr. Sommer,

wie gehe ich das an? Nicht immer alle Sourcefiles in Eclpise warden 
compiliert.

z.B. bei FreeRTOS sind unterschiedliche Memorymodelle im Projekt. Ich 
habe die die ich nicht brauche einfach vom build ausgeschlossen. Sie 
sind aber nach wie vor mit im Projekt.

Wie sieht so ein Linkerscript aus? Wie erstelle ich es?

Grüße
EL

von EL (Gast)


Lesenswert?

Hi Peter,

Die Dateinamen sind relative zum Makefile. Aber die Hirachie wächst dann 
auch über 2-3 Ordner. Die Summe macht das Problem. Wir sprechen von 
einigen Hundert Source dateien.

Was meinst du mit Laufwerksbuchstaben?

Grüße
El

von Peter II (Gast)


Lesenswert?

ld kann die Parameter aus einer Datei lesen

@file Read command-line options from file. The options read are inserted 
in place of the original @file option. If file does not exist, or cannot 
be read, then the option will be treated literally, and not removed.


damit sollte es doch einfach gehen.

von wert (Gast)


Lesenswert?

Andere Möglichkeit:
Objects in ein Archive packen (mit ar), dann muss zum Linken nur der 
Archiv Name auf der Kommandozeile stehen.

von Peter II (Gast)


Lesenswert?

EL schrieb:
> Die Dateinamen sind relative zum Makefile. Aber die Hirachie wächst dann
> auch über 2-3 Ordner. Die Summe macht das Problem. Wir sprechen von
> einigen Hundert Source dateien.
ok, dann bringt das nichts

> Was meinst du mit Laufwerksbuchstaben?
man kann ein virtuelles Laufwerk mit subst anlegen, was in ein 
Verzeichnis zeigt. Damit könnte man etwas sparen, aber du arbeitest ja 
schon relativ da bringt das nichts.


Wie schon geschrieben, kann der ld seine Parameter auch aus einer Datei 
lesen. Die Obj in eine Datei zu scheiben sollte doch recht einfach sein.

von EL (Gast)


Lesenswert?

Hallo Peter,

ich denke das werde ich probieren. Wenn ich dich richtig verstehe
muss ich alle Objectfiles inkl. relativem Pfad dran, zeilenweise in eine
Datei packen.

Ich baue mir also eine Objectlist.  Diese File wird dann an den Linker 
mit @file übergeben?

Ist das so korrekt? Liest der Linker das dann Zeilenweise?!

Ich hoffe ich komme möglichst schnell an die ganzen *.o

von Peter II (Gast)


Lesenswert?

EL schrieb:
> Ist das so korrekt? Liest der Linker das dann Zeilenweise?!

schau doch einfach mal in die Doku:

folgendes steht drin:

Options in file are separated by whitespace. A whitespace character may 
be included in an option by surrounding the entire option in either 
single or double quotes. Any character (including a backslash) may be 
included by prefixing the character to be included with a backslash. The 
file may itself contain additional @file options; any such options will 
be processed recursively.

von EL (Gast)


Lesenswert?

Peter II,

ich denke das ist der richtige Ansatz um das Problem zu lösen.
Danke schonmal dafür

Ich muss jetzt erstmal vor dem Linkprozess dieses Objectlistfile 
erstellen.. :-)

von EL (Gast)


Lesenswert?

Hallo Leute,

ich habe jetzt eine erste funktionierende Version erstellt.
Danke nochmal an Peter.

Ich will euch nicht vorenthalten wie ich es realisiert habe. Allerdings 
halt ich es in meinem Fall nur für einen Workaround. Warum erzähle ich 
euch sofort.

Wie in einem voherigen Post schon erwähnt, generiert Eclipse automatisch 
ein Makefile. Das ist toll, den diese arbeit bleibt dann nicht an mir 
hängen :-). Soweit so gut.

Ich bin jetzt volgendermaßen vorgegangen. Zunächst habe ich mir ein 
Makefile generieren lassen. Dann habe ich die generierung deaktiviert 
damit ich während des Buildprozesses eine Liste meiner Objekte 
anfertigen kann. Vor dem Linken habe ich mir so mit Hilfe der makesyntax 
eine Datei erstellt in der alle Objpfade abgelegt sind.

$(file > OBJLIST.txt, $(OBJS))

Im ld aufruf warden diese dann einfach mit  @file(@OBJLIST.txt) 
übergeben.
Funktioniert wunderbar.

Ihr ahnt jetzt sicher was das Problem ist. Wenn ich weiterhin Makefiles 
generieren lassen möchte, warden meine extra einträge natürlich 
überschrieben.

Komme ich irgendwie an das Template für die Generierung ran?
Dann könnte ich meine extras beliebig hinzufügen.

Danke für die Infos

mfg
EL

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.