Was macht die gcc Linker Option '-n' ?

Gast #5094192
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)
Gast
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)
Gast
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.
Gast
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.
Persönliche Seite
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
Gast
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?
Persönliche Seite
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.