【问题标题】:MinGW gcc malloc issue with -fno-builtin-fno-builtin 的 MinGW gcc malloc 问题
【发布时间】:2014-01-31 18:00:47
【问题描述】:

我在 MinGW gcc 中的 malloc 和 free 有一个奇怪的问题

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

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,我发现 free 被调用 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 和 free,而不必担心任何外部代码调用它们。如果有人也可以解释为什么 MinGW 甚至需要在我上面编写的简单程序中分配内存,我也会很感激。

【问题讨论】:

    标签: c gcc gdb mingw


    【解决方案1】:

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

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

    来自 GCC 手册页:

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

    GCC 通常会生成特殊代码来处理某些内置的 更有效地发挥作用;例如,对“alloca”的调用可能会变成 直接调整堆栈的单个指令,并调用 “memcpy”可能成为内联复制循环。生成的代码通常是 更小更快,但由于函数调用不再出现 因此,您不能在这些调用上设置断点,也不能 通过与不同的链接来改变函数的行为 图书馆。此外,当一个功能被识别为内置 函数,GCC 可能会使用有关该函数的信息来警告 调用该函数的问题,或产生更有效的 代码,即使生成的代码仍然包含对该代码的调用 功能。例如,使用 -Wformat 给出错误调用的警告 到“printf”,当“printf”内置时,并且“strlen”已知不 修改全局内存。

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

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

    A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux

    【讨论】:

    • 我已经编辑了我的问题,如果您能回答标记为“编辑:...”的部分中的部分,将不胜感激
    • @user3258365 刚刚编辑了我的答案。请检查它是否有帮助。
    猜你喜欢
    • 2018-04-17
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2017-01-03
    • 2012-03-23
    • 1970-01-01
    相关资源
    最近更新 更多