MinGW gcc malloc问题与-fno-builtin

时间:2014-01-31 18:00:47

标签: c gcc gdb mingw

我在使用malloc时出现了一个奇怪的问题,并且在MinGW gcc中是免费的

最好用以下程序说明(注意没有外部标题)

void free(void* p)
{
    write(1,"called free\n",12);
}
int main()
{
}

我正在使用以下命令进行编译: gcc -g -fno-builtin test.c

运行这个程序,我希望没有输出,但是当我运行程序时,我得到以下输出:

called free
called free
called free
called free

使用gdb,我发现自由被调用了 mingwrt-4.0.3-1-的mingw32-SRC \ mingwrt-4.0.3-1-的mingw32-SRC \ SRC \ libcrt \杂项\ glob.c

无论如何要关闭它?我原以为指定-fno-builtin会让我的程序不能期望能够调用像free这样的东西

编辑: 我应该澄清一下,我用malloc和free编写了自己的内存库,问题是我不希望MinGW调用这些函数。我也不想使用任何外部库,如stdio或stdlib。

我目前已经实现了一个简单的修复我的malloc和free,但理想情况下我可以将它们命名为malloc并且免费,而不必担心任何外部代码调用它们。如果有人也能解释为什么MinGW甚至需要在我上面写的简单程序中使用malloc内存,我也会很感激。

1 个答案:

答案 0 :(得分:5)

您使用-fno-builtin标志这一事实并不意味着编译器不会调用内置函数。

根据文档,这意味着编译器将为内置函数生成一个完整的函数调用,而不是使用特殊优化,例如为函数生成代码。

来自GCC手册页:

  

无法识别不以_ 内置开头的内置函数   作为前缀。

     

GCC通常会生成特殊代码来处理某些内置函数   功能更有效;例如,对“alloca”的调用可能会变成   单个指令直接调整堆栈,并调用   “memcpy”可能会成为内联复制循环。结果代码经常是   既小又快,但由于函数调用不再出现   因此,您无法在这些呼叫上设置断点,也不能   通过链接不同的方式来改变函数的行为   图书馆。此外,当函数被识别为内置函数时   功能,GCC可以使用有关该功能的信息进行警告   调用该函数的问题,或生成更高效的问题   代码,即使生成的代码仍包含对该代码的调用   功能。例如,对于错误调用,将使用-Wformat给出警告   到“printf”,当内置“printf”时,“strlen”不知道   修改全局记忆。

尽管能够覆盖mallocfree的实现,但我认为删除编译器添加到这些函数以初始化程序环境的调用的唯一方法是只能删除论证-nostartfiles。唯一的问题是,你将负责启动环境,因为编译器不再为你提供它。

这篇文章有点偏离主题,但我相信你可以在那里找到更多的答案和细节:

A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux