Custom board build error (GD32F470_EVAL)

OHh!!! Looking at the startup file it has the vector table with name

but in your file framework-arduinogd32 (2022-09-08)\variants\GD32F470ZK_EVAL your write

SECTIONS
{
  __stack_size = DEFINED(__stack_size) ? __stack_size : 2K;
  
/* ISR vectors */
  .vectors :
  {
    . = ALIGN(4);
    KEEP(*(.vectors))
    . = ALIGN(4);
/*    __Vectors_End = .;
    __Vectors_Size = __Vectors_End - __gVectors;*/
  } >FLASH
 

so the vectors don’t get placed at the right address due to referencing a different name!!

Change this to say

SECTIONS
{
  __stack_size = DEFINED(__stack_size) ? __stack_size : 2K;
  
/* ISR vectors */
  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector))
    . = ALIGN(4);
/*    __Vectors_End = .;
    __Vectors_Size = __Vectors_End - __gVectors;*/
  } >FLASH

and remove and ldscript.ld that you might have in your project directory and referenced in the platformio.ini. The builder script should pick up the one in the variant’s directory.

Now I also remember why platform-gd32/misc/scripts/startup_files_converted_arduino at main · CommunityGD32Cores/platform-gd32 · GitHub exists, these startup files in there have the correct .vector name in the startup file that is compatible with the linker file. But I haven’t yet regenerated those for F470.

I modified .vector to .isr_vector in ldscript.ld file.
(C:\Users\JJS.platformio\packages\framework-arduinogd32\variants\GD32F470ZK_EVAL\ldscript.ld)


unfortunately it still doesn’t work.

“remove and ldscript.ld that you might have in your project directory and referenced in the platformio.ini . The builder script should pick up the one in the variant’s directory.”

I didn’t understand it exactly. which one do you want me to remove? Could you explain again how to set it up?

Is it okay to leave the platformio.ini setting?

[env]
platform = https://github.com/CommunityGD32Cores/platform-gd32.git
platform_packages = 
    framework-arduinogd32@https://github.com/CommunityGD32Cores/ArduinoCore-GD32.git
monitor_speed = 115200

[env:genericGD32F470ZK]
board = genericGD32F470ZK
framework = arduino
build_flags =
    -D GD32F470
    -D GD32F4xx

board_build.ldscript = C:/Users/JJS/.platformio/packages/framework-arduinogd32/variants/GD32F470ZK_EVAL/ldscript.ld
board_build.variant = GD32F470ZK_EVAL 

debug_tool = jlink

This line shouldn’t be needed. (But keep the .ld file of course).

After that change, what output does the command

x/16x 0x8000000

give in the “Debug console”?

platformio.ini


ldscript.ld
image

result of ‘x/16x 0x8000000’

x/16x 0x8000000
Read 4 bytes @ address 0x08000000 (Data = 0xF8134603)
Read 4 bytes @ address 0x08000004 (Data = 0x2A002B01)
Read 4 bytes @ address 0x08000008 (Data = 0x1A18D1FB)
Read 4 bytes @ address 0x0800000C (Data = 0x47703801)

0x8000000 <strlen>:	0xf8134603	0x2a002b01	0x1a18d1fb	0x47703801
Read 4 bytes @ address 0x08000010 (Data = 0x4C05B510)
Read 4 bytes @ address 0x08000014 (Data = 0xB9337823)
Read 4 bytes @ address 0x08000018 (Data = 0xB1134B04)
Read 4 bytes @ address 0x0800001C (Data = 0xF3AF4804)
0x8000010 <__do_global_dtors_aux>:	0x4c05b510	0xb9337823	0xb1134b04	0xf3af4804
Read 4 bytes @ address 0x08000020 (Data = 0x23018000)
Read 4 bytes @ address 0x08000024 (Data = 0xBD107023)
Read 4 bytes @ address 0x08000028 (Data = 0x20000068)
Read 4 bytes @ address 0x0800002C (Data = 0x00000000)
0x8000020 <__do_global_dtors_aux+16>:	0x23018000	0xbd107023	0x20000068	0x00000000
Read 4 bytes @ address 0x08000030 (Data = 0x080015F4)
Read 4 bytes @ address 0x08000034 (Data = 0x4B03B508)
Read 4 bytes @ address 0x08000038 (Data = 0x4903B11B)
Read 4 bytes @ address 0x0800003C (Data = 0xF3AF4803)
0x8000030 <__do_global_dtors_aux+32>:	0x080015f4	0x4b03b508	0x4903b11b	0xf3af4803
{"token":363,"outOfBandRecord":[],"resultRecords":{"resultClass":"done","results":[]}}

How in the world can the strlen function be placed there. Something is terribly out of sync with the startup .S file and the linker script.