Gcc 禁用动态内存分配?

Gcc 禁用动态内存分配?,gcc,stm32,dynamic-memory-allocation,Gcc,Stm32,Dynamic Memory Allocation,我试图在低资源应用程序中完全禁用动态内存分配。我从不使用malloc/free等,据我所知,我的任何依赖项都不使用 我已尝试在链接器文件LinkerScript.ld中清除堆: 但这似乎并不能保证没有库函数会尝试调用malloc 有没有一种方法可以强制执行不可能发生动态内存分配,并且在这种情况下使构建失败 在这个项目上没有操作系统-裸机,与arm none eabi gcc交叉编译 我试图在低资源应用程序中完全禁用动态内存分配 这是不寻常的。一般来说,人们正在限制托管应用程序使用的动态内存,而如

我试图在低资源应用程序中完全禁用动态内存分配。我从不使用malloc/free等,据我所知,我的任何依赖项都不使用

我已尝试在链接器文件LinkerScript.ld中清除堆:

但这似乎并不能保证没有库函数会尝试调用malloc

有没有一种方法可以强制执行不可能发生动态内存分配,并且在这种情况下使构建失败

在这个项目上没有操作系统-裸机,与arm none eabi gcc交叉编译

我试图在低资源应用程序中完全禁用动态内存分配

这是不寻常的。一般来说,人们正在限制托管应用程序使用的动态内存,而如何做到这一点则是另一个问题,通常是特定的。为什么要完全禁用它?如下所述,动态内存很可能在实现内部使用

仔细阅读C11标准或C99标准

C语言基本上有两种模式或两种方言:托管C语言和独立C语言。本标准中的确切措辞如下:

这两种形式的一致性实现是托管的和独立的。一致性托管实施应接受任何严格一致的程序。一致性独立实施应接受任何严格一致的程序,其中图书馆第7条中规定的功能的使用仅限于标准标题、、、和的内容

malloc在中定义并声明,应该可用于托管实现,通常在独立实现中不可用,但这是特定于实现的

显然,您使用的是一个独立的实现,因为您没有标准要求托管实现使用的malloc。这是一种模式。你应该用它。则不可用,并且您的代码不能在该模式下使用标准malloc,除非它显式声明malloc

在托管实现中,通常可以重新定义malloc,前提是它仍然具有标准要求的所有属性。然后,您可能会使用一些类似于总是失败但仍然符合标准的malloc实现

最后,如果您使用GNU链接器,那么如果您的对象文件包含对malloc的任何外部引用,那么链接总是会失败。通过添加一些特定的配方或规则,在可能使用nm的情况下,或者如果您的构建自动化不允许在链接之前进行这样的检查,那么在您的应用程序中实现这一点是微不足道的,请切换到这样的工具:,以及其他许多工具

如果您想在托管环境中的编译时检测malloc的任何使用,您可以自己编写这样做,我觉得这太过分了,但选择权在您。或者在实践中更简单地使用一些脚本,例如在C源代码中检测malloc或calloc单词的出现

请注意,在大多数托管实现中,实际上像fprintf、fopen、printf、fputc和许多其他标准函数都在内部使用malloc,至少有时是这样。具体地说,如果您的程序在托管实现之上使用fopen,则很可能间接使用malloc,因为在标准文件中通常有一些堆分配的缓冲区,fopen正在malloc-ing,并且它通常在fclose时获得free-d

有没有一种方法可以强制执行不可能发生动态内存分配,并且在这种情况下使构建失败

实际上,是的。只需在Makefile中添加一些脚本来执行这样的检查。在源文件上使用grep,或在目标文件上使用nm。但是如果在代码中使用标准的fopen,它通常会在内部执行一些malloc

在应用程序使用的许多堆上(如果有的话),有一种方法可以在运行时限制堆内存。Linux已经使用了RLIMIT_数据

如果在托管环境(如GNU或)中使用某些或开源实现,则可以研究其源代码并检查fopen是否使用堆内存。

在中,库函数由newlib C库提供。malloc和friends的newlib实现使用_sbrk函数为堆分配内存,该函数必须由用户软件实现

如果应用程序中没有sbrk,那么构建将在链接时失败。找到并删除它

您可能还想了解如何找到,或者

在哪个操作系统上,或者,正如标准所说,在哪个运行时环境上?您至少应该回答您的问题,以便更多地解释您的应用程序?它是托管的还是独立的?您使用的是什么C标准库、什么操作系统(如果有的话)?您的应用程序具体在做什么?为什么需要禁用堆分配?如果没有这些细节,你的问题是unclear@BasileStarynkevitch 和标记的使用强烈地表明了某种运行时环境,严格来说,它是独立的,但允许用户拥有他想要的任意多的托管功能。
_Min_Heap_Size = 0x000;  /* required amount of heap  */