cancel
Showing results for 
Search instead for 
Did you mean: 

sysmem.c build error in clang

When building an STM32CubeMX generated cmake project with clang there are two files that generate errors:

  1. sysmem.c
  2. the linker script (STM32L431RCTX_FLASH.ld and stm32l476rgtx_flash.ld)

sysmem.c produces the following error:

Core/Src/sysmem.c:30:35: error: use of undeclared identifier 'NULL'
[build] 30 | static uint8_t *__sbrk_heap_end = NULL;

This is caused by the fact that only errno.h and stdint.h are included. None of them officially define NULL. But they probably do in gcc.

sysmem.c can easily be modified by either:

  1. including stddef.h or any other header that defines NULL (https://en.cppreference.com/w/c/types/NULL). This is something ST could do.
  2. or modifying build to forcebly include such a file in all files (adding "-include stddef.h" to compile command). I did this so I wouldn't have to modify the file (which would get overwritten by regenerating code).But it's kind of a hack.
Linker scmemory region not defined: RAM
[build] >>> _estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */ript generates the following errors:

and

[build] ld.lld: error: STM32L431RCTX_FLASH_clang.ld:93: symbol not found: READONLY
[build] ld.lld: error: unable to place section .ARM.extab at file offset [0xFFFFFFFFF8010000, 0xFFFFFFFFF800FFFF]; check your linker script for overflows

Linker script can easily be modified by:

  1. putting "Memories definition" at the beginning
  2. and removing the "(READONLY)" parts

Modifying sysmem.c would have priority in my opinion since linker scripts often need to be modified anyway.

The resulting code now builds with both clang and gcc without errors (many warnings though, but that is kind of the point for me, so I can run clang-tidy and parse the syntax tree).

Kudo posts if you have the same problem and kudo replies if the solution works.
Click "Accept as Solution" if a reply solved your problem. If no solution was posted please answer with your own.
3 REPLIES 3
Pavel A.
Evangelist III

About NULL: +1.

Even without clang,  It looks like stdint.h from "mainstream" GNU headers does not define NULL. The following causes error with gcc on rextester:

 

//gcc 7.4.0
#include  <errno.h>
#include  <stdint.h>
int main(void)
{
    return (int)NULL;
}

 

NULL is defined in the newlib headers, not portable.

 

Saket_Om
ST Employee

Hello @unsigned_char_array 

The Cmake project generated by STM32CubeMX is typically designed to work with the GNU Arm Embedded Toolchain.

If your question is answered, please close this topic by clicking "Accept as Solution".

Thanks
Omar

I know. But there is a bug in sysmem.c that can be fixed with 1 line of code.

Kudo posts if you have the same problem and kudo replies if the solution works.
Click "Accept as Solution" if a reply solved your problem. If no solution was posted please answer with your own.