I have an application that runs on an ARM Cortex-M based MCU and is written in C and C++. I use gcc
and g++
to compile it and would like to completely disable any heap usage.
In the MCU startup file the heap size is already set to 0. In addition to that, I would also like to disallow any accidental heap use in the code.
In other words, I would like the linker (and/or the compiler) to give me an error when the malloc
, calloc
, free
functions or the new
, new[]
, delete
, delete[]
operators are used.
So far I've tried -nostdlib
which gives me issues like undefined reference to _start
. I also tried -nodefaultlibs
but that one still does not complain when I try to call malloc
. What is the right way to do this?
Notes:
- This app runs on “bare metal”, there is no operating system.
- I would also like to avoid any malloc usage in 3rd-party code (vendor-specific libraries, the standard library, printf etc.).
- I'm fully okay with not using the parts of the C / C++ standard libraries that would require dynamic memory allocations.
- I'd prefer a compile-time rather than a run-time solution.
I'm not sure it's the best way to go, however you can use the
--wrap
flag ofld
(which can pass throughgcc
using-Wl
).The idea is that
--wrap
allows you to ask told
to redirect the "real" symbol to your custom one; for example, if you do--wrap=malloc
, thenld
will look for your__wrap_malloc
function to be called instead of the original `malloc.Now, if you do
--wrap=malloc
without defining__wrap_malloc
you will get away with it if nobody uses it, but if anyone referencesmalloc
you'll get a linking error.For
new
you can use the mangled names_Znwm
(operator new(unsigned long)
) and_Znam
(operator new[](unsigned long)
), which should be what everynew
should come down to in the end.(posted as an answer because it won't fit in a comment)
If the OS you're running supports the use of
LD_PRELOAD
, this code should detect attempts to use the heap:Assuming
new
is implemented usingmalloc()
anddelete
is implemented usingfree()
, that will catch all heap usage and give you a core file with a stack trace, assuming core files are enabled.Add the proper headers, compile the file:
Run your app: