GCC: How to disable heap usage entirely on an MCU?
arm, g++, gcc, heap-memory, microcontroller
Solution
I'm not sure it's the best way to go, however you can use the `--wrap` flag of `ld` (which can pass through `gcc` using `-Wl`).
The idea is that `--wrap` allows you to ask to `ld` to redirect the "real" symbol to your custom one; for example, if you do `--wrap=malloc`, then `ld` 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 references `malloc` you'll get a linking error.
$ cat test-nomalloc.c
#include <stdlib.h>
int main() {
#ifdef USE_MALLOC
malloc(10);
#endif
return 0;
}
$ gcc test-nomalloc.c -Wl,--wrap=malloc
$ gcc test-nomalloc.c -DUSE_MALLOC -Wl,--wrap=malloc
/tmp/ccIEUu9v.o: In function `main':
test-nomalloc.c:(.text+0xa): undefined reference to `__wrap_malloc'
collect2: error: ld returned 1 exit status
For `new` you can use the mangled names `_Znwm` (`operator new(unsigned long)`) and `_Znam` (`operator new[](unsigned long)`), which should be what every `new` should come down to in the end.
Problem
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.