MinGW gcc malloc问题与-fno-builtin

0 c gcc gdb mingw

我在mallG中遇到一个奇怪的问题,在MinGW gcc中免费

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

void free(void* p)
{
    write(1,"called free\n",12);
}
int main()
{
}
Run Code Online (Sandbox Code Playgroud)

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

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

called free
called free
called free
called free
Run Code Online (Sandbox Code Playgroud)

使用gdb,我发现在mingwrt-4.0.3-1-mingw32-src\mingwrt-4.0.3-1-mingw32-src\src\libcrt\misc\glob.c中可以自由调用

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

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

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

Vin*_*ira 5

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

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

来自GCC手册页:

不识别不以_ builtin 作为前缀开头的内置函数.

GCC通常会生成特殊代码来更有效地处理某些内置函数; 例如,对"alloca"的调用可能会成为直接调整堆栈的单个指令,而对"memcpy"的调用可能会成为内联复制循环.生成的代码通常更小更快,但由于函数调用不再显示,因此您无法在这些调用上设置断点,也无法通过链接到不同的库来更改函数的行为.此外,当函数被识别为内置函数时,GCC可以使用有关该函数的信息来警告调用该函数的问题,或生成更高效的代码,即使结果代码仍包含对该函数的调用.例如,警告与-Wformat给出已知不会改变全局内存坏呼叫"printf"上,当时的"printf"是内置的,而"strlen的".

尽管是能够覆盖的实施mallocfree,我相信删除通话编译器添加到这些函数初始化程序环境的唯一途径是唯一可能的论点删除-nostartfiles.唯一的问题是,你将负责启动环境,因为编译器不再为你提供它.

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

关于为Linux创建真正的Teensy ELF可执行文件的旋风教程