Linker-Error C++ embedded ARM Cortex-M4 (hidden symbol `__dso_handle' isn't defined)
-
Hallo,
ich bin dabei für mehrere Microcontroller eine Abstraktion von Interrupts zu schreiben. Die geschieht hauptsächlich in C++.
Genutzt wird die Editor-Erweiterung PlatformIO(gibt auch ein Standalone-CLI davon)Mein Problem tritt beim Kompilieren des Targets STM32F407VG auf, der dann den mir unschlüssigen Fehler wirft:
Processing stm32f407vg (platform: ststm32; board: disco_f407vg) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- CONFIGURATION: https://docs.platformio.org/page/boards/ststm32/disco_f407vg.html PLATFORM: ST STM32 5.7.0 > ST STM32F4DISCOVERY HARDWARE: STM32F407VGT6 168MHz, 128KB RAM, 1MB Flash DEBUG: Current (stlink) On-board (stlink) External (blackmagic, jlink) PACKAGES: toolchain-gccarmnoneeabi 1.70201.0 (7.2.1) LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf LDF Modes: Finder ~ chain, Compatibility ~ soft Found 0 compatible libraries Scanning dependencies... No dependencies arm-none-eabi-g++ -o .pio/build/stm32f407vg/firmware.elf -T stm32f405x6.ld -Wl,--gc-sections,--relax -mthumb -nostartfiles -nostdlib -mcpu=cortex-m4 .pio/build/stm32f407vg/src/main.o .pio/build/stm32f407vg/src/target/STM32F407VG/InterruptVectorTable.o .pio/build/stm32f407vg/src/target/STM32F407VG/startup_stm32f4xx.o .pio/build/stm32f407vg/src/target/STM32F407VG/system_stm32f4xx.o -L/Users/john/.platformio/platforms/ststm32/ldscripts -L.pio/build/stm32f407vg -Wl,--start-group -lc -lgcc -lm -lstdc++ -lnosys -Wl,--end-group .pio/build/stm32f407vg/src/main.o: In function `main': /Users/john/Documents/PlatformIO/Projects/Testing_MCB1768/include/hal/InterruptVectorTable.hpp:133: undefined reference to `__dso_handle' /Users/john/.platformio/packages/toolchain-gccarmnoneeabi/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m/libc.a(lib_a-fini.o): In function `__libc_fini_array': fini.c:(.text.__libc_fini_array+0x26): undefined reference to `_fini' /Users/john/.platformio/packages/toolchain-gccarmnoneeabi/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/bin/ld: .pio/build/stm32f407vg/firmware.elf: hidden symbol `__dso_handle' isn't defined /Users/john/.platformio/packages/toolchain-gccarmnoneeabi/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/bin/ld: final link failed: Bad value collect2: error: ld returned 1 exit status *** [.pio/build/stm32f407vg/firmware.elf] Error 1
Das Projekt kann man unter https://github.com/jxsl13/lpc1768_blinky_example/tree/non_stl_abstraction finden.
Der Commit https://github.com/jxsl13/lpc1768_blinky_example/commit/1fe278b6bb1943e81f6021137f4df541c25aa2b3 hat den Fehler eingeführt.Ich bin mir leider nicht sicher, woran es genau liegt.
Die Implementierung findet sich entsprechend in dersrc/target/STM32F407VG/InterruptVectorTable.cpp
Die definierende Header-Datei ist hier: https://github.com/jxsl13/lpc1768_blinky_example/blob/non_stl_abstraction/include/hal/InterruptVectorTable.hpp
Und die implementierende C++-Datei ist hier: https://github.com/jxsl13/lpc1768_blinky_example/blob/non_stl_abstraction/src/target/STM32F407VG/InterruptVectorTable.cpp
Besten Danke für jegliche Hilfe.
Bei Fragen fragen.
-
Das scheint wohl an dem Parameter
-nostartfiles
zu liegen, s.a. die letzten Antworten in c++11 undefined reference to `__dso_handle'.
-
Vielleicht hilft dir ja das hier weiter:
https://www.c-plusplus.net/forum/topic/349762/c-11-undefined-reference-to-__dso_handle
Da hier für Bare Metal kompiliert wird, noch dazu mit eigenem Linker-Skript
-T stm32f405x6.ld
, wird dir hier wohl nur jemand weiterhelfen können, der ebenfalls Erfahrung mit genau dieser Plattform hat.Edit: Ja, probiers mal ohne
-nostartfiles
, das hat jedenfalls in dem anderen Thread geholfen - allerdings muss die Option ja irgendeinen Sinn haben, die übergibt man normalerweise nur, wenn man genau weiss, warum man sie braucht (also wer immer das Build-Skript oder was das da ist geschreiben hat). Aus dem Bauch raus würd ich sagen, dass es Aufgabe des Linker-Skripts ist, dafür zu sorgen dass es trotz-nostartfiles
läuft, ohne dass der Compiler meckert.
-
Beim entfernen der Flag
-nostartfiles
ändert sich scheinbar nichts.The terminal process terminated with exit code: 1 Terminal will be reused by tasks, press any key to close it. > Executing task: platformio run --environment stm32f407vg < Processing stm32f407vg (platform: ststm32; board: disco_f407vg) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- CONFIGURATION: https://docs.platformio.org/page/boards/ststm32/disco_f407vg.html PLATFORM: ST STM32 5.7.0 > ST STM32F4DISCOVERY HARDWARE: STM32F407VGT6 168MHz, 128KB RAM, 1MB Flash DEBUG: Current (stlink) On-board (stlink) External (blackmagic, jlink) PACKAGES: toolchain-gccarmnoneeabi 1.70201.0 (7.2.1) LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf LDF Modes: Finder ~ chain, Compatibility ~ soft Found 0 compatible libraries Scanning dependencies... No dependencies arm-none-eabi-g++ -o .pio/build/stm32f407vg/src/main.o -c -fno-rtti -fno-exceptions -std=c++1z -std=gnu++1z -ffunction-sections -fdata-sections -Wall -mthumb -nostdlib -mcpu=cortex-m4 -Og -g3 -ggdb3 -DF_CPU=168000000L -DDISCO_F407VG -DPLATFORMIO=40003 -DSTM32F4 -DSTM32F407xx -DSTM32F40_41xxx -DARDUINO_STM32DiscoveryF407 -DBOARD_discovery_f4 -DSTM32F407VG -DDEBUG -D__PLATFORMIO_BUILD_DEBUG__ -Iinclude -Isrc src/main.cpp arm-none-eabi-g++ -o .pio/build/stm32f407vg/src/target/STM32F407VG/InterruptVectorTable.o -c -fno-rtti -fno-exceptions -std=c++1z -std=gnu++1z -ffunction-sections -fdata-sections -Wall -mthumb -nostdlib -mcpu=cortex-m4 -Og -g3 -ggdb3 -DF_CPU=168000000L -DDISCO_F407VG -DPLATFORMIO=40003 -DSTM32F4 -DSTM32F407xx -DSTM32F40_41xxx -DARDUINO_STM32DiscoveryF407 -DBOARD_discovery_f4 -DSTM32F407VG -DDEBUG -D__PLATFORMIO_BUILD_DEBUG__ -Iinclude -Isrc src/target/STM32F407VG/InterruptVectorTable.cpp arm-none-eabi-gcc -x assembler-with-cpp -ffunction-sections -fdata-sections -Wall -mthumb -nostdlib -mcpu=cortex-m4 -DF_CPU=168000000L -DDISCO_F407VG -DPLATFORMIO=40003 -DSTM32F4 -DSTM32F407xx -DSTM32F40_41xxx -DARDUINO_STM32DiscoveryF407 -DBOARD_discovery_f4 -DSTM32F407VG -DDEBUG -D__PLATFORMIO_BUILD_DEBUG__ -Iinclude -Isrc -c -o .pio/build/stm32f407vg/src/target/STM32F407VG/startup_stm32f4xx.o src/target/STM32F407VG/startup_stm32f4xx.S arm-none-eabi-gcc -o .pio/build/stm32f407vg/src/target/STM32F407VG/system_stm32f4xx.o -c -ffunction-sections -fdata-sections -Wall -mthumb -nostdlib -mcpu=cortex-m4 -Og -g3 -ggdb3 -DF_CPU=168000000L -DDISCO_F407VG -DPLATFORMIO=40003 -DSTM32F4 -DSTM32F407xx -DSTM32F40_41xxx -DARDUINO_STM32DiscoveryF407 -DBOARD_discovery_f4 -DSTM32F407VG -DDEBUG -D__PLATFORMIO_BUILD_DEBUG__ -Iinclude -Isrc src/target/STM32F407VG/system_stm32f4xx.c In file included from include/hal/InterruptVectorTable.hpp:3:0, from src/main.cpp:3: include/config.hpp:6:35: note: #pragma message: 201703L #pragma message (XSTR(__cplusplus)) ^ In file included from include/hal/InterruptVectorTable.hpp:3:0, from src/target/STM32F407VG/InterruptVectorTable.cpp:2: include/config.hpp:6:35: note: #pragma message: 201703L #pragma message (XSTR(__cplusplus)) ^ arm-none-eabi-g++ -o .pio/build/stm32f407vg/firmware.elf -T stm32f405x6.ld -Wl,--gc-sections,--relax -mthumb -nostdlib -mcpu=cortex-m4 .pio/build/stm32f407vg/src/main.o .pio/build/stm32f407vg/src/target/STM32F407VG/InterruptVectorTable.o .pio/build/stm32f407vg/src/target/STM32F407VG/startup_stm32f4xx.o .pio/build/stm32f407vg/src/target/STM32F407VG/system_stm32f4xx.o -L/Users/john/.platformio/platforms/ststm32/ldscripts -L.pio/build/stm32f407vg -Wl,--start-group -lc -lgcc -lm -lstdc++ -lnosys -Wl,--end-group .pio/build/stm32f407vg/src/main.o: In function `main': /Users/john/Documents/PlatformIO/Projects/Testing_MCB1768/include/hal/InterruptVectorTable.hpp:133: undefined reference to `__dso_handle' /Users/john/.platformio/packages/toolchain-gccarmnoneeabi/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m/libc.a(lib_a-fini.o): In function `__libc_fini_array': fini.c:(.text.__libc_fini_array+0x26): undefined reference to `_fini' /Users/john/.platformio/packages/toolchain-gccarmnoneeabi/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/bin/ld: .pio/build/stm32f407vg/firmware.elf: hidden symbol `__dso_handle' isn't defined /Users/john/.platformio/packages/toolchain-gccarmnoneeabi/bin/../lib/gcc/arm-none-eabi/7.2.1/../../../../arm-none-eabi/bin/ld: final link failed: Bad value collect2: error: ld returned 1 exit status *** [.pio/build/stm32f407vg/firmware.elf] Error 1
Da scheinbar laut SO
-nostartfiles
und-nostdlib
eng zusammenhängen, hatte ich auch versucht beide zu entfernen, jedoch ebenfalls ohne Erfolg.Das Linker-Script wird von PlatformIO(IDIE) bereitgestellt.
Vor dem letzten Commit funktionierte noch alles prima, ich verstehe nicht, was genau der letzte Commit angerichtet hat, sodass das alles so zerschossen ist, sodass es nicht mehr kompiliert.
Danke für die schnelle Antwort.
-
TLDR:
statisch erzeugte Objekte scheinen, zumindest in Verbindung mit dem STM32F407VG, den ich nutze (LPC1768 funktionierte wunderbar), den Destruktiv nicht zu mögen.
-
@jxsl13 sagte in Linker-Error C++ embedded ARM Cortex-M4 (hidden symbol `__dso_handle' isn't defined):
statisch erzeugte Objekte scheinen, zumindest in Verbindung mit dem STM32F407VG, den ich nutze (LPC1768 funktionierte wunderbar), den Destruktiv nicht zu mögen.
Nicht exakt deine Plattform, aber hier wird empfohlen, das Symbol einfach manuell anzulegen. Falls das einwandfrei funktioniert, ist das definitiv besser als keine statischen Objekte mit nicht-trivialen Destruktoren haben zu dürfen. Ich kann aber nicht sagen, ob das irgendwelche weiteren Implikationen hat, dem Symbol einfach nur stumpf einen pointer-großen Speicherbereich zu geben.
Intuitiv würde ich auch erwarten, dass du auf deiner Plattform mit "DSO" (dynamische Bibliotheken) eigentlich nichts zu tun hast - vielleicht ist das auch nur ein in deinem Fall unbeabsichtigtes Überbleibsel von Code, der in .so/.dll-Code aufräumen soll.
Man kan dieses Symbol auch vom Linker-Skript automatisch anlegen lassen, das wäre wohl die eleganteste Lösung, da man mit solchen internen Symbolen im Quellcode eigentlich nichts am Hut haben sollte. Mit solchen Skripten bin ich allerdings etwas eingerostet, daher kann ich dir auf die schnelle kein funktionierendes Beispiel geben - es ist aber definitiv ziemlich simpel.