GCC:如何在MCU上完全禁用堆使用?

Ven*_*emo 7 heap microcontroller gcc arm g++

我有一个在基于ARM Cortex-M的MCU上运行的应用程序,用C和C++编写.我使用gccg++编译它,并希望完全禁用任何堆使用.

在MCU启动文件中,堆大小已经设置为0.除此之外,我还想禁止在代码中使用任何意外的堆.

换句话说,我想接头(和/或编译器),以给我一个错误时malloc,calloc,free功能或new,new[],delete,delete[]运营商使用.

到目前为止,我已经尝试过-nostdlib这样的问题undefined reference to _start.我也尝试过,-nodefaultlibs但是当我试着打电话时,我仍然没有抱怨malloc.这样做的正确方法是什么?

笔记:

  • 这个应用程序运行"裸机",没有操作系统.
  • 我还想避免在第三方代码中使用任何malloc(特定于供应商的库,标准库,printf等).
  • 我完全可以不使用需要动态内存分配的C/C++标准库部分.
  • 我更喜欢编译时而不是运行时解决方案.

Mat*_*lia 6

我不确定这是最好的方法,但你可以使用(可以通过使用)的--wrap标志.ldgcc-Wl

这个想法是--wrap允许您要求ld将"真实"符号重定向到您的自定义符号; 例如,如果你这样做--wrap=malloc,那么ld将寻找你的__wrap_malloc函数而不是原来的`malloc.

现在,如果你--wrap=malloc 没有定义__wrap_malloc,如果没有人使用它malloc你会逃脱它,但如果有人引用你会得到一个链接错误.

$ 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
Run Code Online (Sandbox Code Playgroud)

因为new你可以使用损坏的名称_Znwm(operator new(unsigned long))和_Znam(operator new[](unsigned long)),这应该是new最终应该归结为什么.

  • 实际上,看起来我根本不必费心使用 `libstdc++`,因为它在底层也使用了 `malloc`。 (2认同)