Forum: Compiler & IDEs Verwirrung um libc_nano, weak und Clang


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Vincent H. (vinci)


Lesenswert?

Grüß euch

Ich hab eine Frage bezüglich weak Symbolen in der libc_nano (und 
libstdc++_nano). Und zwar arbeite ich gerade an einem Cortex-M4 Projekt 
dass ich aus Gründen der Compile-Zeit nun lieber mit Clang10 als mit 
GCC10 bauen würde. Das ist mit Ausnahme des Linkens eigentlich auch 
keine Hexerei und funktionierte auch recht flott.

Einige Kleinigkeiten verwirren mich jedoch. Aus irgendeinem Grund 
scheint Clang10 beim Linken nicht zu erkennen welche Symbole weak sind 
und welche nicht. Es ist somit nicht möglich Dinge wie __assert_func mit 
sinnvollen Implementierungen zu überschreiben. Welchen Linker man nutzt 
(einstellbar via -fuse-ld) spielt dabei auch keine Rolle.

Irgendwer eine Idee woran das liegen könnte?

Hier die Linker-Flags

GCC10
1
    -nostartfiles
2
    --specs=nano.specs
3
    -Wl,--gc-sections,-Map=${PROJECT_NAME}.map
4
    -T${CMAKE_CURRENT_SOURCE_DIR}/ldscript/mem.ld
5
    -T${CMAKE_CURRENT_SOURCE_DIR}/ldscript/sections.ld)

Clang10
1
    -nostartfiles
2
    -nostdlib
3
    -nostdlib++
4
    -Wl,--gc-sections,-Map=${PROJECT_NAME}.map
5
    /usr/arm-none-eabi/lib/crt0.o
6
    /usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crti.o
7
    /usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crtbegin.o
8
    /usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crtn.o
9
    /usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crtend.o
10
    -L/usr/arm-none-eabi/lib/thumb/v7e-m+fp/hard/
11
    -L/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/
12
    -Wl,--start-group
13
    -lstdc++_nano
14
    -lm
15
    -lgcc
16
    -lc_nano
17
    -Wl,--end-group
18
    -T${CMAKE_CURRENT_SOURCE_DIR}/ldscript/mem.ld
19
    -T${CMAKE_CURRENT_SOURCE_DIR}/ldscript/sections.ld)


PS: Kann man sich irgendwie anzeigen lassen zu welchen Flags die GCC 
"spec" files auf der Kommandozeile tatsächlich runterbrechen?

/edit
Typo fixed

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Vincent H. schrieb:
> Kann man sich irgendwie anzeigen lassen zu welchen Flags die GCC "spec"
> files auf der Kommandozeile tatsächlich runterbrechen?

gcc -v meinst du?

von Vincent H. (vinci)


Lesenswert?

Jörg W. schrieb:
> Vincent H. schrieb:
>> Kann man sich irgendwie anzeigen lassen zu welchen Flags die GCC "spec"
>> files auf der Kommandozeile tatsächlich runterbrechen?
>
> gcc -v meinst du?

Achja... auf die Idee hät ich auch kommen können...
Ich werd mal schaun obs da gravierende Unterschiede gibt.

von Vincent H. (vinci)


Lesenswert?

Ich hab nun beide Linkvorgänge verbos angesehn, werd aber trotzdem nicht 
wirklich schlau draus. Zwei kleine Unterschiede fielen mir allerdings 
auf.

- GCC10 scheint zuerst meine eigenen Bibliotheken und erst anschließend 
libc_nano und Co zu linken
- GCC10 wiederholt das Linken von libc_nano in 2x Gruppen? Das hab ich 
mit Clang aber ebenfalls probiert und es scheint keinen Einfluss auf das 
Endergebnis zu haben...

GCC10
1
/usr/lib/gcc/arm-none-eabi/10.1.0/collect2 
2
-plugin /usr/lib/gcc/arm-none-eabi/10.1.0/liblto_plugin.so 
3
-plugin-opt=/usr/lib/gcc/arm-none-eabi/10.1.0/lto-wrapper 
4
-plugin-opt=-fresolution=/tmp/ccea5cKc.res 
5
-plugin-opt=-pass-through=-lgcc 
6
-plugin-opt=-pass-through=-lg_nano 
7
-plugin-opt=-pass-through=-lc_nano 
8
-plugin-opt=-pass-through=-lgcc 
9
-plugin-opt=-pass-through=-lc_nano 
10
--sysroot=/usr/arm-none-eabi 
11
-EL -X -o myelf 
12
-L/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard 
13
-L/usr/lib/gcc/arm-none-eabi/10.1.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard 
14
-L/usr/arm-none-eabi/lib/thumb/v7e-m+fp/hard -L/usr/lib/gcc/arm-none-eabi/10.1.0 
15
-L/usr/lib/gcc/arm-none-eabi/10.1.0/../../../../arm-none-eabi/lib 
16
-L/usr/arm-none-eabi/lib 
17
--gc-sections
18
my.obj
19
libmylib.a
20
-lstdc++_nano -lm 
21
--start-group -lgcc -lg_nano -lc_nano --end-group 
22
--start-group -lgcc -lc_nano --end-group
23
-T ldscript.ld

Clang10
1
"/usr/bin/ld.lld" 
2
--gc-sections 
3
/usr/arm-none-eabi/lib/crt0.o 
4
/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crti.o 
5
/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crtbegin.o 
6
/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crtn.o 
7
/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crtend.o 
8
--start-group -lstdc++_nano -lm -lgcc -lc_nano --end-group 
9
my.obj
10
libmylib.a
11
-Bstatic 
12
-L/usr/lib/clang/10.0.0/lib/baremetal 
13
-L/usr/arm-none-eabi/lib/thumb/v7e-m+fp/hard/ 
14
-L/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/ 
15
-T ldscript.ld
16
-o myelf

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Kontrolliere die Kommandozeile mit der du clang aufrufst. In deinem 
clang-Beispiel erscheinen sie in der falschen Reihenfolge.

Leider hat sich in den Köpfen vieler Programmierer festgesetzt dass die 
Kommandozeilen-Reihenfolge in der man Objektdateien und Bibliotheken 
angeben kann beliebig ist. Dank den Internet-Idioten die den selben 
Stuss von Webseite zu Webseite weiter kopieren.

Es wird aber immer noch in der Reihenfolge der Parameter gelinkt. Bei 
dynamischem Linken fällt es nur nicht so auf.

Kurzform:

gut: a.o b.o c.o -lx -ly -lz

scheiße: -lx -ly -ly a.o b.o c.o

Letzteres erscheint in deinem Beispiel
>
1
> --start-group -lstdc++_nano -lm -lgcc -lc_nano --end-group 
2
> my.obj
3
> libmylib.a
4
>

von DPA (Gast)


Lesenswert?

Ich denke, --whole-archive ... --no-whole-archive könnten hier eventuell 
helfen: 
https://stackoverflow.com/questions/52435705/whats-difference-between-start-group-and-whole-archive-in-l

von Vincent H. (vinci)


Lesenswert?

Hat leider ein wenig gedauert bis ich rausgefunden hab wie das in CMake 
zu bewerkstelligen ist... Hab nun ein "target_link_options" durch ein 
"target_link_libraries" ersetzen müssen. Just CMake things... ;)

Danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.