Forum: Compiler & IDEs Was macht die gcc Linker Option '-n' ?


von Johannes S. (Gast)


Lesenswert?

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)

von hink (Gast)


Lesenswert?

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)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?


von Johannes S. (Gast)


Lesenswert?

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.

von Dr. No (Gast)


Lesenswert?

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.

von Johannes S. (Gast)


Lesenswert?

ok, auch data size bleibt gleich.

Und g++ und c++ sind auch identische Executables (unter Windows).

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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

von Johannes S. (Gast)


Lesenswert?

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?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von Johannes S. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.