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 der src/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 -nostdlibeng 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.



  • Lösung:
    https://community.platformio.org/t/linker-error-firmware-elf-hidden-symbol-dso-handle-isnt-defined/10533/3

    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 &#x60;__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.


Anmelden zum Antworten