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


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

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.