gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:39:18 30 4
gpt4 key购买 nike

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

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

换句话说,我希望链接器(和/或编译器)在 malloc 时给我一个错误。 , calloc , free函数或 new , new[] , delete , delete[]使用运算符。

到目前为止,我已经尝试过 -nostdlib这给了我像 undefined reference to _start 这样的问题.我也试过-nodefaultlibs但是当我尝试调用 malloc 时,那个人仍然没有提示。 .这样做的正确方法是什么?

笔记:

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

    我不确定这是不是最好的方法,但是您可以使用 --wrap ld 的标志(可以通过 gcc 使用 -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

    对于 new你可以使用困惑的名字 _Znwm ( operator new(unsigned long) ) 和 _Znam ( operator new[](unsigned long) ),这应该是每个 new应该归结为到底。

    关于GCC:如何在 MCU 上完全禁用堆使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40130374/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com