CMD Limit unter Windows GCC-Linkeraufruf

Gast #4631925
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
Gast #4631946
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.
Gast #4631952
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
Gast #4631958
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
Gast #4631959
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.
Gast #4631966
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.
Gast #4631977
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
Gast #4631981
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.
Gast #4632251
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren