【问题标题】:How to GCC compile without _alloca?如何在没有 _alloca 的情况下进行 GCC 编译?
【发布时间】:2011-01-21 20:01:25
【问题描述】:

出于某种原因,我应该使用 gcc 编译一个 C 文件,然后链接到 Visual C++ 2008 项目。

(我用的是当前最新的gcc版本:cygwin gcc 4.3.4 20090804。)

但是有一个问题:gcc总是用_alloca分配一个大数组,

VC 链接器无法解析符号 __alloca。

例如,

int func()
{
    int big[10240];
    ....
}

虽然我没有显式调用 _alloca 函数,但这段代码产生了 _alloca 依赖项。

(数组大小很重要。如果我更改 10240 -> 128,一切正常)

我尝试了 gcc 选项 -fno-builtin-alloca 或 -fno-builtin,但没有运气。

是否可以让 gcc 不使用 _alloca ? (或调整阈值?)

【问题讨论】:

  • 为什么不直接使用malloc()
  • 这不是我的书面来源,编辑起来有些复杂。也许原作者不希望惩罚调用malloc。
  • 在这种情况下,alloca 的目的是确保堆栈足够大以容纳此数组。 Microsoft 编译器不需要 alloca;它将这个堆栈探测代码直接发送到函数中。当本地人很小时,不需要堆栈探针。如果不使用 -fno-builtin-alloca 和 -fno-builtin 会怎样?
  • 哦,天哪,10k 是一个巨大的对象,无论它是否有效,都是一个可怕的想法。你能把代码改成不这样做吗?
  • @ephe: (1) 这不是他的代码。 (2) 在没有适当的free 的情况下更改为malloc 会导致泄漏。

标签: visual-c++ gcc alloca


【解决方案1】:

最好的办法是用 VC++ 编译所有代码。如果那是不可能的..

您应该使用mingw gcc 而不是 cygwin。它旨在输出将链接到 VC++ 运行时的代码,而不是 cygwin 库。特别是,它将调用 VC++ 运行时函数 __chkstk 而不是 __alloca。

【讨论】:

  • 我尝试了 MinGW (gcc 3.4.5 mingw-vista special r3) 并编译了一个简单的 C 源代码。但 dumpbin 结果显示 __alloca 依赖: dumpbin /symbols test.obj ... 00C 00000000 UNDEF notype External | __alloca ... mingw 有什么特殊的选项吗?
  • 啊,对不起。 mingw.org gcc 就是这样做的。 TDM GCC 4.x mingw 构建输出 __chkstk。 tdragon.net/recentgcc
  • 谢谢。我检查了 TDM gcc 总是输出 __chkstk,但是 VC2008 在 Release 构建时输出 _chkstk,在 Debug 构建时输出 _alloca_probe。我想我应该编辑代码以使用 4K 以下的本地变量。
【解决方案2】:

您可以编写自己的 _alloca 例程并链接到它。查看 gcc 库源代码,看看它应该做什么。

【讨论】:

  • 当我在VS2008中实现_alloca时,我得到:error C2169: '_alloca' : intrinsic function, cannot be defined
  • 我认为您可能希望使用 gcc 而不是 Visual Studio 来实现您的自定义 _alloca。
【解决方案3】:

看起来_alloca 已被 Microsoft 弃用,并且在 VS2005 之后不再出现在他们的运行时库中。较新的运行时库支持_malloca

您的选项看起来不太好。您可以尝试使用 VS2005 进行构建。也许 cygwin 有一个选项,您可以告诉它您正在使用更新的运行时库(如果他们还不支持,您可以将其作为功能请求提交)。

【讨论】:

    【解决方案4】:
    猜你喜欢
    • 2018-09-03
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2013-02-16
    相关资源
    最近更新 更多