作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个在基于 ARM Cortex-M 的 MCU 上运行并用 C 和 C++ 编写的应用程序。我用 gcc
和 g++
编译它并希望完全禁用任何堆使用。
在 MCU 启动文件中,堆大小已设置为 0。除此之外,我还想禁止在代码中意外使用堆。
换句话说,我希望链接器(和/或编译器)在 malloc
时给我一个错误。 , calloc
, free
函数或 new
, new[]
, delete
, delete[]
使用运算符。
到目前为止,我已经尝试过 -nostdlib
这给了我像 undefined reference to _start
这样的问题.我也试过-nodefaultlibs
但是当我尝试调用 malloc
时,那个人仍然没有提示。 .这样做的正确方法是什么?
笔记:
最佳答案
我不确定这是不是最好的方法,但是您可以使用 --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/
我是一名优秀的程序员,十分优秀!