Hallo, ich habe ein mbed Projekt mit Cortex-M und da steckt im Linker Aufruf die Option '-n', ich kann dazu aber nix finden was diese macht. Der Linker meckert jedenfalls nicht und das Program läuft auch. Ist diese Option eventuell obsolet und nur noch historischen Gründen drin? Der Linker wird aufgerufen über 'arm-none-eabi-c++ -Wl,-n' (mit einer Menge weiterer Optionen). PS Compiler version: 5.4.1 20160919 (release)
Hier die manpage zum Linker (der ld heißt): https://linux.die.net/man/1/ld Zitat:
1 | -n |
2 | --nmagic |
3 | Turn off page alignment of sections, and mark the output as "NMAGIC" if possible. |
https://stackoverflow.com/questions/15400910/ld-linker-script-producing-huge-binary Der Linker macht kein Alignment mehr und der Code wird dadurch kleiner. Dann dürfte die Applikation/Lib aber etwas langsamer werden? (-> das ist geraten)
Danke. Ja, es gibt viel Doku, man muss nur die richtige finden. Ich bin beim gcc gelandet und da gab es die in den Linker options nicht: https://gcc.gnu.org/onlinedocs/gcc/Invoking-GCC.html#Invoking-GCC Wo ist da der Unterschied? Und macht es einen Unterschied ob der Linker über arm-none-eabi-c++ oder arm-none-eabi-g++ aufgerufen wird? Die Codegrösse hat sich auch nicht geändert mit/ohne -n.
Johannes S. schrieb: > Danke. > Ja, es gibt viel Doku, man muss nur die richtige finden. Ich bin beim > gcc gelandet und da gab es die in den Linker options nicht: > https://gcc.gnu.org/onlinedocs/gcc/Invoking-GCC.ht... > > Wo ist da der Unterschied? Und macht es einen Unterschied ob der Linker > über arm-none-eabi-c++ oder arm-none-eabi-g++ aufgerufen wird? > > Die Codegrösse hat sich auch nicht geändert mit/ohne -n. Mein arm-none-eabi-ld Version 2.26 sagt zur Option: -n, --nmagic Do not page align data Betrifft also nur die Daten. Wenn Du genug Platz hast, dann lass die Option weg.
ok, auch data size bleibt gleich. Und g++ und c++ sind auch identische Executables (unter Windows).
Johannes S. schrieb: > Danke. > Ja, es gibt viel Doku, man muss nur die richtige finden. Ich bin beim > gcc gelandet und da gab es die in den Linker options nicht: > https://gcc.gnu.org/onlinedocs/gcc/Invoking-GCC.html Du verwendest -Wl, was die nachfolgende(n) Schalter an den Linker weitergibt. Der Compiler-Treiber sieht diese Option also garnicht und wertet sie auch nicht aus. https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#index-Wl
Johann L. schrieb: > Du verwendest -Wl, was die nachfolgende(n) Schalter an den Linker > weitergibt. Der Compiler-Treiber sieht diese Option also garnicht und > wertet sie auch nicht aus. das ist mir bekannt, nur hier sind auch einige Optionen für den Linker beschrieben: https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options dann gibt es einen Unterschied zwischen compiler link step und dem tatsächlichen Linker Aufruf? Irgendwie sehr verwirrend... Nachtrag: Ok, die Doku bezieht sich auf den Fall das ich mit g++ gleichzeitig den compile+link mache?
Johannes S. schrieb: > Johann L. schrieb: >> Du verwendest -Wl, was die nachfolgende(n) Schalter an den Linker >> weitergibt. Der Compiler-Treiber sieht diese Option also garnicht und >> wertet sie auch nicht aus. > > das ist mir bekannt, nur hier sind auch einige Optionen für den Linker > beschrieben: > https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options > > dann gibt es einen Unterschied zwischen compiler link step und dem > tatsächlichen Linker Aufruf? Irgendwie sehr verwirrend... > > Nachtrag: > Ok, die Doku bezieht sich auf den Fall das ich mit g++ gleichzeitig den > compile+link mache? Nein, "gleichzeitig" muss es nicht sein. Du kannst auch erst g++ -c machen und dann g++ *.o ... g++ und gcc sind lediglich Treiber-Programme, die je nach Optionen und übergebenen Quellen Sub-Prozesse aufrufen wie z.B. Compiler (cc1plus oder cc1), Assembler (as) und Linker (collect2 / ld). "Options for Linking" sind Optionen, die beim Linken verwendet werden, also wenn g++ / gcc als (Linker-)Treiber verwendet wird und das Linken nicht per -S, -E oder -c etc. unterbunden wird. "Options for the Linker" wären Optionen für den Linker, also das, was nach -Wl, oder -Xlinker folgt. Einen Link-Aufruf für ld händisch zu basteln ist kompliziert und fehlerträchtig, daher verwendet man dazu gcc / g++ als Treiber. Wenn du die Sub-Prozesse nebst Optionen sehen willst, die der Treiber auslöst, kannst du beim g++ Aufruf -v -Wl,-v angeben.
Danke, das bringt wieder etwas mehr Licht in den gcc Dschungel :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.