This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

how to create a library compatible with the GNU toolchain

I have a Keil MDK project which outputs a library mc_comms.lib.  I have another Keil project which uses this library and don't have any issues. My customer is using STM Cube and can't build the same test project with the same library.

c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: cannot find -lB:/STM32/G4/Examples/CubeIDE_1_6_0/zti_lib/zti_lib/lib/mc_comms.lib
FYI:  

b:\STM32\G4\Examples\CubeIDE_1_6_0\zti_lib\zti_lib\lib>dir
Volume in drive B is home
Volume Serial Number is 4D4B-F115

Directory of b:\STM32\G4\Examples\CubeIDE_1_6_0\zti_lib\zti_lib\lib

03/18/2021 11:34 <DIR> .
03/17/2021 20:14 <DIR> ..
03/17/2021 18:16 2,139 mc_comms.h
03/18/2021 11:33 32,674 mc_comms.lib
2 File(s) 34,813 bytes
2 Dir(s) 11,366,381,383,680 bytes free

b:\STM32\G4\Examples\CubeIDE_1_6_0\zti_lib\zti_lib\lib>

Even if I change to GNU toolchain I still have issues: 

linking...
c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: c:/st/stm32cubeide_1.6.0/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924/tools/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc.a(lib_a-exit.o): in function `exit':
exit.c:(.text.exit+0x16): undefined reference to `_exit'
c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: ./out/startup_stm32g431xx.o:(.text+0x0): undefined reference to `_sidata'
c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: ./out/startup_stm32g431xx.o:(.text+0x4): undefined reference to `_sdata'
c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: ./out/startup_stm32g431xx.o:(.text+0xc): undefined reference to `_sbss'
c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: ./out/startup_stm32g431xx.o:(.text+0x10): undefined reference to `_ebss'
c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: ./out/startup_stm32g431xx.o: in function `LoopForever':
B:/STM32/G4/Examples/mc_comm_lib GNU mk9p0/../../Nimbus/PAL/SRC/startup_stm32g431xx.asm:63: undefined reference to `_estack'
c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: B:/STM32/G4/Examples/mc_comm_lib GNU mk9p0/../../Nimbus/PAL/SRC/startup_stm32g431xx.asm:67: undefined reference to `_sdata'
c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: B:/STM32/G4/Examples/mc_comm_lib GNU mk9p0/../../Nimbus/PAL/SRC/startup_stm32g431xx.asm:69: undefined reference to `_sidata'
c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: B:/STM32/G4/Examples/mc_comm_lib GNU mk9p0/../../Nimbus/PAL/SRC/startup_stm32g431xx.asm:87: undefined reference to `_siccmram'
c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: B:/STM32/G4/Examples/mc_comm_lib GNU mk9p0/../../Nimbus/PAL/SRC/startup_stm32g431xx.asm:93: undefined reference to `_sccmram'
c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: B:/STM32/G4/Examples/mc_comm_lib GNU mk9p0/../../Nimbus/PAL/SRC/startup_stm32g431xx.asm:94: undefined reference to `_eccmram'
c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: B:/STM32/G4/Examples/mc_comm_lib GNU mk9p0/../../Nimbus/PAL/SRC/startup_stm32g431xx.asm:100: undefined reference to `_sbss'
c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: B:/STM32/G4/Examples/mc_comm_lib GNU mk9p0/../../Nimbus/PAL/SRC/startup_stm32g431xx.asm:101: undefined reference to `_ebss'
c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: ./out/startup_stm32g431xx.o:(.isr_vector+0x0): undefined reference to `_estack'
collect2.exe: error: ld returned 1 exit status

Do you know what is my problem? How can I resolve it? 

Thanks.

Parents Reply Children
  • Is that is an absolute mast? 1. I prefer to use what I use - i.e armcc v.5.06 b7. For this particular case, I can try armcc v6. What if one has a required library but doesn't have its source?

    As an alternative, as you can see I'm using GNU within Keil MDK but still have errors, which I can't resolve..What should I do within MDK to make it happy? I really don't spend any time with Cube. 

    Thanks. 

  • For GCC compiler questions, this might not be the best forum to ask, since most users here are using the Arm Compiler 5 or Arm Compiler 6.

    Looking around, it appears symbols like _sbss and _ebss are meant to be defined in a linker script file. See these articles in a series on linker files:

    https://interrupt.memfault.com/blog/how-to-write-linker-scripts-for-firmware

    https://interrupt.memfault.com/blog/zero-to-main-1

    I suggest trying to build a project in Keil using 'gcc-arm-none-eabi-10-2020' , make sure that works, then try building this project.

  • You also might want to post in the GNU Toolchain forum. For example, this post sets up a .ld file that defines a _ebss - one of the symbols you are missing.

    https://community.arm.com/developer/tools-software/oss-platforms/f/gnu-toolchain-forum/45784/how-do-i-implement-multiple-relocate-segments

  • I added the linker script file used by the Cube project to Keil linker options.. Here is my build output:

    Build started: Project: main
    *** Note: Rebuilding project, since 'Options->Output->Create Batch File' is selected.
    Rebuild target 'mc_comm_lib_mk9p0'
    compiling main.c...
    compiling system_stm32g4xx.c...
    assembling startup_stm32g431xx.asm...
    linking...
    c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: ./out/startup_stm32g431xx.o: in function `LoopForever':
    B:/STM32/G4/Examples/mc_comm_lib GNU mk9p0/../../Nimbus/PAL/SRC/startup_stm32g431xx.asm:87: undefined reference to `_siccmram'
    c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: B:/STM32/G4/Examples/mc_comm_lib GNU mk9p0/../../Nimbus/PAL/SRC/startup_stm32g431xx.asm:93: undefined reference to `_sccmram'
    c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: B:/STM32/G4/Examples/mc_comm_lib GNU mk9p0/../../Nimbus/PAL/SRC/startup_stm32g431xx.asm:94: undefined reference to `_eccmram'
    c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: c:/st/stm32cubeide_1.6.0/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924/tools/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc.a(lib_a-exit.o): in function `exit':
    exit.c:(.text.exit+0x16): undefined reference to `_exit'
    collect2.exe: error: ld returned 1 exit status
    ".\OUT\main.elf" - 1 Error(s), 0 Warning(s).
    Target not created.
    Build Time Elapsed:  00:00:07

    I'm attaching the startup file here

    /**
      ******************************************************************************
      * @file      startup_stm32g431xx.s
      * @author    MCD Application Team
      * @brief     STM32G431xx devices vector table GCC toolchain.
      *            This module performs:
      *                - Set the initial SP
      *                - Set the initial PC == Reset_Handler,
      *                - Set the vector table entries with the exceptions ISR address,
      *                - Configure the clock system
      *                - Branches to main in the C library (which eventually
      *                  calls main()).
      *            After Reset the Cortex-M4 processor is in Thread mode,
      *            priority is Privileged, and the Stack is set to Main.
      ******************************************************************************
      * @attention
      *
      * <h2><center>© Copyright (c) 2019 STMicroelectronics.
      * All rights reserved.</center></h2>
      *
      * This software component is licensed by ST under BSD 3-Clause license,
      * the "License"; You may not use this file except in compliance with the
      * License. You may obtain a copy of the License at:
      *                        opensource.org/licenses/BSD-3-Clause
      *
      ******************************************************************************
      */
    
      .syntax unified
    	.cpu cortex-m4
    	.fpu softvfp
    	.thumb
    
    .global	g_pfnVectors
    .global	Default_Handler
    
    /* start address for the initialization values of the .data section.
    defined in linker script */
    .word	_sidata
    /* start address for the .data section. defined in linker script */
    .word	_sdata
    /* end address for the .data section. defined in linker script */
    .word	_edata
    /* start address for the .bss section. defined in linker script */
    .word	_sbss
    /* end address for the .bss section. defined in linker script */
    .word	_ebss
    
    .equ  BootRAM,        0xF1E0F85F
    /**
     * @brief  This is the code that gets called when the processor first
     *          starts execution following a reset event. Only the absolutely
     *          necessary set is performed, after which the application
     *          supplied main() routine is called.
     * @param  None
     * @retval : None
    */
    
        .section	.text.Reset_Handler
    	.weak	Reset_Handler
    	.type	Reset_Handler, %function
    Reset_Handler:
      ldr   r0, =_estack
      mov   sp, r0          /* set stack pointer */
    
    /* Copy the data segment initializers from flash to SRAM */
      ldr r0, =_sdata
      ldr r1, =_edata
      ldr r2, =_sidata
      movs r3, #0
      b	LoopCopyDataInit
    
    CopyDataInit:
      ldr r4, [r2, r3]
      str r4, [r0, r3]
      adds r3, r3, #4
    
    LoopCopyDataInit:
      adds r4, r0, r3
      cmp r4, r1
      bcc CopyDataInit
      
    /* Zero fill the bss segment. */
      ldr r2, =_sbss
      ldr r4, =_ebss
      movs r3, #0
      b LoopFillZerobss
    
    FillZerobss:
      str  r3, [r2]
      adds r2, r2, #4
    
    LoopFillZerobss:
      cmp r2, r4
      bcc FillZerobss
    
    /* Call the clock system intitialization function.*/
        bl  SystemInit
    /* Call static constructors */
        bl __libc_init_array
    /* Call the application's entry point.*/
    	bl	main
    
    LoopForever:
        b LoopForever
    
    .size	Reset_Handler, .-Reset_Handler
    
    /**
     * @brief  This is the code that gets called when the processor receives an
     *         unexpected interrupt.  This simply enters an infinite loop, preserving
     *         the system state for examination by a debugger.
     *
     * @param  None
     * @retval : None
    */
        .section	.text.Default_Handler,"ax",%progbits
    Default_Handler:
    Infinite_Loop:
    	b	Infinite_Loop
    	.size	Default_Handler, .-Default_Handler
    /******************************************************************************
    *
    * The minimal vector table for a Cortex-M4.  Note that the proper constructs
    * must be placed on this to ensure that it ends up at physical address
    * 0x0000.0000.
    *
    ******************************************************************************/
     	.section	.isr_vector,"a",%progbits
    	.type	g_pfnVectors, %object
    	.size	g_pfnVectors, .-g_pfnVectors
    
    
    g_pfnVectors:
    	.word	_estack
    	.word	Reset_Handler
    	.word	NMI_Handler
    	.word	HardFault_Handler
    	.word	MemManage_Handler
    	.word	BusFault_Handler
    	.word	UsageFault_Handler
    	.word	0
    	.word	0
    	.word	0
    	.word	0
    	.word	SVC_Handler
    	.word	DebugMon_Handler
    	.word	0
    	.word	PendSV_Handler
    	.word	SysTick_Handler
    	.word	WWDG_IRQHandler
    	.word	PVD_PVM_IRQHandler
    	.word	RTC_TAMP_LSECSS_IRQHandler
    	.word	RTC_WKUP_IRQHandler
    	.word	FLASH_IRQHandler
    	.word	RCC_IRQHandler
    	.word	EXTI0_IRQHandler
    	.word	EXTI1_IRQHandler
    	.word	EXTI2_IRQHandler
    	.word	EXTI3_IRQHandler
    	.word	EXTI4_IRQHandler
    	.word	DMA1_Channel1_IRQHandler
    	.word	DMA1_Channel2_IRQHandler
    	.word	DMA1_Channel3_IRQHandler
    	.word	DMA1_Channel4_IRQHandler
    	.word	DMA1_Channel5_IRQHandler
    	.word	DMA1_Channel6_IRQHandler
    	.word	0
    	.word	ADC1_2_IRQHandler
    	.word	USB_HP_IRQHandler
    	.word	USB_LP_IRQHandler
    	.word	FDCAN1_IT0_IRQHandler
    	.word	FDCAN1_IT1_IRQHandler
    	.word	EXTI9_5_IRQHandler
    	.word	TIM1_BRK_TIM15_IRQHandler
    	.word	TIM1_UP_TIM16_IRQHandler
    	.word	TIM1_TRG_COM_TIM17_IRQHandler
    	.word	TIM1_CC_IRQHandler
    	.word	TIM2_IRQHandler
    	.word	TIM3_IRQHandler
    	.word	TIM4_IRQHandler
    	.word	I2C1_EV_IRQHandler
    	.word	I2C1_ER_IRQHandler
    	.word	I2C2_EV_IRQHandler
    	.word	I2C2_ER_IRQHandler
    	.word	SPI1_IRQHandler
    	.word	SPI2_IRQHandler
    	.word	USART1_IRQHandler
    	.word	USART2_IRQHandler
    	.word	USART3_IRQHandler
    	.word	EXTI15_10_IRQHandler
    	.word	RTC_Alarm_IRQHandler
    	.word	USBWakeUp_IRQHandler
    	.word	TIM8_BRK_IRQHandler
    	.word	TIM8_UP_IRQHandler
    	.word	TIM8_TRG_COM_IRQHandler
    	.word	TIM8_CC_IRQHandler
    	.word	0
    	.word	0
    	.word	LPTIM1_IRQHandler
    	.word	0
    	.word	SPI3_IRQHandler
    	.word	UART4_IRQHandler
    	.word	0
    	.word	TIM6_DAC_IRQHandler
    	.word	TIM7_IRQHandler
    	.word	DMA2_Channel1_IRQHandler
    	.word	DMA2_Channel2_IRQHandler
    	.word	DMA2_Channel3_IRQHandler
    	.word	DMA2_Channel4_IRQHandler
    	.word	DMA2_Channel5_IRQHandler
    	.word	0
    	.word	0
    	.word	UCPD1_IRQHandler
    	.word	COMP1_2_3_IRQHandler
    	.word	COMP4_IRQHandler
    	.word	0
    	.word	0
    	.word	0
    	.word	0
    	.word	0
    	.word	0
    	.word	0
    	.word	0
    	.word	0
    	.word	CRS_IRQHandler
    	.word	SAI1_IRQHandler
    	.word	0
    	.word	0
    	.word	0
    	.word	0
    	.word	FPU_IRQHandler
    	.word	0
    	.word	0
    	.word	0
    	.word	0
    	.word	0
    	.word	0
    	.word	0
    	.word	0
    	.word	RNG_IRQHandler
    	.word	LPUART1_IRQHandler
    	.word	I2C3_EV_IRQHandler
    	.word	I2C3_ER_IRQHandler
    	.word	DMAMUX_OVR_IRQHandler
    	.word	0
    	.word	0
    	.word	DMA2_Channel6_IRQHandler
    	.word	0
    	.word	0
    	.word	CORDIC_IRQHandler
    	.word	FMAC_IRQHandler
    
    /*******************************************************************************
    *
    * Provide weak aliases for each Exception handler to the Default_Handler.
    * As they are weak aliases, any function with the same name will override
    * this definition.
    *
    *******************************************************************************/
    
    	.weak	NMI_Handler
    	.thumb_set NMI_Handler,Default_Handler
    
    	.weak	HardFault_Handler
    	.thumb_set HardFault_Handler,Default_Handler
    
    	.weak	MemManage_Handler
    	.thumb_set MemManage_Handler,Default_Handler
    
    	.weak	BusFault_Handler
    	.thumb_set BusFault_Handler,Default_Handler
    
    	.weak	UsageFault_Handler
    	.thumb_set UsageFault_Handler,Default_Handler
    
    	.weak	SVC_Handler
    	.thumb_set SVC_Handler,Default_Handler
    
    	.weak	DebugMon_Handler
    	.thumb_set DebugMon_Handler,Default_Handler
    
    	.weak	PendSV_Handler
    	.thumb_set PendSV_Handler,Default_Handler
    
    	.weak	SysTick_Handler
    	.thumb_set SysTick_Handler,Default_Handler
    
    	.weak	WWDG_IRQHandler
    	.thumb_set WWDG_IRQHandler,Default_Handler
    
    	.weak	PVD_PVM_IRQHandler
    	.thumb_set PVD_PVM_IRQHandler,Default_Handler
    
    	.weak	RTC_TAMP_LSECSS_IRQHandler
    	.thumb_set RTC_TAMP_LSECSS_IRQHandler,Default_Handler
    
    	.weak	RTC_WKUP_IRQHandler
    	.thumb_set RTC_WKUP_IRQHandler,Default_Handler
    
    	.weak	FLASH_IRQHandler
    	.thumb_set FLASH_IRQHandler,Default_Handler
    
    	.weak	RCC_IRQHandler
    	.thumb_set RCC_IRQHandler,Default_Handler
    
    	.weak	EXTI0_IRQHandler
    	.thumb_set EXTI0_IRQHandler,Default_Handler
    
    	.weak	EXTI1_IRQHandler
    	.thumb_set EXTI1_IRQHandler,Default_Handler
    
    	.weak	EXTI2_IRQHandler
    	.thumb_set EXTI2_IRQHandler,Default_Handler
    
    	.weak	EXTI3_IRQHandler
    	.thumb_set EXTI3_IRQHandler,Default_Handler
    
    	.weak	EXTI4_IRQHandler
    	.thumb_set EXTI4_IRQHandler,Default_Handler
    
    	.weak	DMA1_Channel1_IRQHandler
    	.thumb_set DMA1_Channel1_IRQHandler,Default_Handler
    
    	.weak	DMA1_Channel2_IRQHandler
    	.thumb_set DMA1_Channel2_IRQHandler,Default_Handler
    
    	.weak	DMA1_Channel3_IRQHandler
    	.thumb_set DMA1_Channel3_IRQHandler,Default_Handler
    
    	.weak	DMA1_Channel4_IRQHandler
    	.thumb_set DMA1_Channel4_IRQHandler,Default_Handler
    
    	.weak	DMA1_Channel5_IRQHandler
    	.thumb_set DMA1_Channel5_IRQHandler,Default_Handler
    
    	.weak	DMA1_Channel6_IRQHandler
    	.thumb_set DMA1_Channel6_IRQHandler,Default_Handler
    
    	.weak	ADC1_2_IRQHandler
    	.thumb_set ADC1_2_IRQHandler,Default_Handler
    
    	.weak	USB_HP_IRQHandler
    	.thumb_set USB_HP_IRQHandler,Default_Handler
    
    	.weak	USB_LP_IRQHandler
    	.thumb_set USB_LP_IRQHandler,Default_Handler
    
    	.weak	FDCAN1_IT0_IRQHandler
    	.thumb_set FDCAN1_IT0_IRQHandler,Default_Handler
    
    	.weak	FDCAN1_IT1_IRQHandler
    	.thumb_set FDCAN1_IT1_IRQHandler,Default_Handler
    
    	.weak	EXTI9_5_IRQHandler
    	.thumb_set EXTI9_5_IRQHandler,Default_Handler
    
    	.weak	TIM1_BRK_TIM15_IRQHandler
    	.thumb_set TIM1_BRK_TIM15_IRQHandler,Default_Handler
    
    	.weak	TIM1_UP_TIM16_IRQHandler
    	.thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler
    
    	.weak	TIM1_TRG_COM_TIM17_IRQHandler
    	.thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler
    
    	.weak	TIM1_CC_IRQHandler
    	.thumb_set TIM1_CC_IRQHandler,Default_Handler
    
    	.weak	TIM2_IRQHandler
    	.thumb_set TIM2_IRQHandler,Default_Handler
    
    	.weak	TIM3_IRQHandler
    	.thumb_set TIM3_IRQHandler,Default_Handler
    
    	.weak	TIM4_IRQHandler
    	.thumb_set TIM4_IRQHandler,Default_Handler
    
    	.weak	I2C1_EV_IRQHandler
    	.thumb_set I2C1_EV_IRQHandler,Default_Handler
    
    	.weak	I2C1_ER_IRQHandler
    	.thumb_set I2C1_ER_IRQHandler,Default_Handler
    
    	.weak	I2C2_EV_IRQHandler
    	.thumb_set I2C2_EV_IRQHandler,Default_Handler
    
    	.weak	I2C2_ER_IRQHandler
    	.thumb_set I2C2_ER_IRQHandler,Default_Handler
    
    	.weak	SPI1_IRQHandler
    	.thumb_set SPI1_IRQHandler,Default_Handler
    
    	.weak	SPI2_IRQHandler
    	.thumb_set SPI2_IRQHandler,Default_Handler
    
    	.weak	USART1_IRQHandler
    	.thumb_set USART1_IRQHandler,Default_Handler
    
    	.weak	USART2_IRQHandler
    	.thumb_set USART2_IRQHandler,Default_Handler
    
    	.weak	USART3_IRQHandler
    	.thumb_set USART3_IRQHandler,Default_Handler
    
    	.weak	EXTI15_10_IRQHandler
    	.thumb_set EXTI15_10_IRQHandler,Default_Handler
    
    	.weak	RTC_Alarm_IRQHandler
    	.thumb_set RTC_Alarm_IRQHandler,Default_Handler
    
    	.weak	USBWakeUp_IRQHandler
    	.thumb_set USBWakeUp_IRQHandler,Default_Handler
    
    	.weak	TIM8_BRK_IRQHandler
    	.thumb_set TIM8_BRK_IRQHandler,Default_Handler
    
    	.weak	TIM8_UP_IRQHandler
    	.thumb_set TIM8_UP_IRQHandler,Default_Handler
    
    	.weak	TIM8_TRG_COM_IRQHandler
    	.thumb_set TIM8_TRG_COM_IRQHandler,Default_Handler
    
    	.weak	TIM8_CC_IRQHandler
    	.thumb_set TIM8_CC_IRQHandler,Default_Handler
    
    	.weak	LPTIM1_IRQHandler
    	.thumb_set LPTIM1_IRQHandler,Default_Handler
    
    	.weak	SPI3_IRQHandler
    	.thumb_set SPI3_IRQHandler,Default_Handler
    
    	.weak	UART4_IRQHandler
    	.thumb_set UART4_IRQHandler,Default_Handler
    
    	.weak	TIM6_DAC_IRQHandler
    	.thumb_set TIM6_DAC_IRQHandler,Default_Handler
    
    	.weak	TIM7_IRQHandler
    	.thumb_set TIM7_IRQHandler,Default_Handler
    
    	.weak	DMA2_Channel1_IRQHandler
    	.thumb_set DMA2_Channel1_IRQHandler,Default_Handler
    
    	.weak	DMA2_Channel2_IRQHandler
    	.thumb_set DMA2_Channel2_IRQHandler,Default_Handler
    
    	.weak	DMA2_Channel3_IRQHandler
    	.thumb_set DMA2_Channel3_IRQHandler,Default_Handler
    
    	.weak	DMA2_Channel4_IRQHandler
    	.thumb_set DMA2_Channel4_IRQHandler,Default_Handler
    
    	.weak	DMA2_Channel5_IRQHandler
    	.thumb_set DMA2_Channel5_IRQHandler,Default_Handler
    
    	.weak	UCPD1_IRQHandler
    	.thumb_set UCPD1_IRQHandler,Default_Handler
    
    	.weak	COMP1_2_3_IRQHandler
    	.thumb_set COMP1_2_3_IRQHandler,Default_Handler
    
    	.weak	COMP4_IRQHandler
    	.thumb_set COMP4_IRQHandler,Default_Handler
    
    	.weak	CRS_IRQHandler
    	.thumb_set CRS_IRQHandler,Default_Handler
    
    	.weak	SAI1_IRQHandler
    	.thumb_set SAI1_IRQHandler,Default_Handler
    
    	.weak	FPU_IRQHandler
    	.thumb_set FPU_IRQHandler,Default_Handler
    
    	.weak	RNG_IRQHandler
    	.thumb_set RNG_IRQHandler,Default_Handler
    
    	.weak	LPUART1_IRQHandler
    	.thumb_set LPUART1_IRQHandler,Default_Handler
    
    	.weak	I2C3_EV_IRQHandler
    	.thumb_set I2C3_EV_IRQHandler,Default_Handler
    
    	.weak	I2C3_ER_IRQHandler
    	.thumb_set I2C3_ER_IRQHandler,Default_Handler
    
    	.weak	DMAMUX_OVR_IRQHandler
    	.thumb_set DMAMUX_OVR_IRQHandler,Default_Handler
    
    	.weak	DMA2_Channel6_IRQHandler
    	.thumb_set DMA2_Channel6_IRQHandler,Default_Handler
    
    	.weak	CORDIC_IRQHandler
    	.thumb_set CORDIC_IRQHandler,Default_Handler
    
    	.weak	FMAC_IRQHandler
    	.thumb_set FMAC_IRQHandler,Default_Handler
    
    /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
    

  • I copied ld file from the Cube project and have some improvements:

    c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: c:/st/stm32cubeide_1.6.0/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924/tools/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc.a(lib_a-exit.o): in function `exit':

  • I'm sure that my problem is incorrect linker settings. What are the correct ones?

    -T ./stm32g4_flash.ld -mcpu=cortex-m4 -mthumb -mthumb-interwork -Wl,-Map="./main.map" 
    -o ./OUT/main.elf 
    
    Build started: Project: main
    Build target 'mc_comm_lib_mk9p0'
    compiling system_stm32g4xx.c...
    compiling main.c...
    linking...
    c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: error: ./OUT/main.elf uses VFP register arguments, c:/ST/STM32CubeIDE_1.6.0/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924/tools/arm-none-eabi/lib/\libc.a(lib_a-init.o) does not
    c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: failed to merge target specific data of file c:/ST/STM32CubeIDE_1.6.0/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924/tools/arm-none-eabi/lib/\libc.a(lib_a-init.o)
    c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: error: ./OUT/main.elf uses VFP register arguments, c:/ST/STM32CubeIDE_1.6.0/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924/tools/arm-none-eabi/lib/\libc.a(lib_a-memcpy-stub.o) does not
    c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: failed to merge target specific data of file c:/ST/STM32CubeIDE_1.6.0/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924/tools/arm-none-eabi/lib/\libc.a(lib_a-memcpy-stub.o)
    c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: error: ./OUT/main.elf uses VFP register arguments, c:/ST/STM32CubeIDE_1.6.0/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924/tools/arm-none-eabi/lib/\libc.a(lib_a-memset.o) does not
    c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: failed to merge target specific data of file c:/ST/STM32CubeIDE_1.6.0/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924/tools/arm-none-eabi/lib/\libc.a(lib_a-memset.o)
    c:\st\stm32cubeide_1.6.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924\tools\arm-none-eabi\bin\ld.exe: c:/ST/STM32CubeIDE_1.6.0/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_1.5.0.202011040924/tools/arm-none-eabi/lib/\libc.a(lib_a-init.o): in function `__libc_init_array':
    init.c:(.text.__libc_init_array+0x20): undefined reference to `_init'
    collect2.exe: error: ld returned 1 exit status
    ".\OUT\main.elf" - 1 Error(s), 0 Warning(s).
    Target not created.
    Build Time Elapsed:  00:00:02