【问题标题】:gcc and reentrant codegcc 和可重入代码
【发布时间】:2010-06-13 06:29:13
【问题描述】:

GCC 是否为所有场景生成可重入代码?

【问题讨论】:

    标签: gcc embedded real-time reentrancy


    【解决方案1】:

    不,您必须编写可重入代码。

    【讨论】:

    • 但是,是否有任何 gcc 变体生成可重入代码?
    【解决方案2】:

    可重入性是 ISO C 和 C++ 在设计上能够实现的,因此包括 GCC。编写可重入功能仍然是您的责任。

    即使函数被正确编码以实现可重入,C 编译器也不会生成可重入代码,这将是例外而不是规则,并且可能是出于架构约束的原因(例如没有足够的资源来支持堆栈,因此生成静态帧)。在这些情况下,编译器文档应该清楚说明这一点。

    您可能会阅读的一些文章:

    【讨论】:

      【解决方案3】:

      不,GCC 不保证您编写的代码。这是编写可重入代码的好链接。

      https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/generalprogramming/writing_reentrant_thread_safe_code.html

      【讨论】:

        【解决方案4】:

        可重入不是编译器可以控制的——由程序员编写可重入代码。为此,您需要避免所有明显的陷阱,例如全局变量(包括局部静态变量)、共享资源、线程、对其他不可重入函数的调用等。

        话虽如此,一些小型嵌入式系统的交叉编译器,例如8051,默认情况下可能不会生成可重入代码,您可能必须通过例如请求特定功能的可重入代码#pragma

        【讨论】:

        【解决方案5】:

        GCC 至少会在其编译的大多数平台上生成可重入代码(尤其是如果您避免按值传递或返回结构),但特定语言或平台 ABI 可能另有规定。您需要更加具体才能做出更具决定性的陈述;我知道,如果正在编译的代码本身基本上是可重入的,那么它在桌面处理器上肯定是可重入的(当然,奇怪的全局状态技巧会在任何平台上给你带来麻烦)。

        【讨论】:

        • 确切地说,我使用 gcc 编译在 x86、arm 和 sparc 上可重入的代码完全没有问题。
        【解决方案6】:

        不,GCC 不可能保证您编写的代码可重入。

        但是,在主要平台上,编译器生成或包含的代码(例如数学内在函数或函数调用)是可重入的。由于 GCC 不支持不可重入函数调用很常见的平台,例如 8051,因此编译器出现重入问题的风险很小。

        有些 GCC 端口存在错误和问题,例如 MSP430 版本。

        【讨论】:

        • 您的意思是说有 GCC 工具链支持各种平台的可重入代码但存在一些问题?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-08
        相关资源
        最近更新 更多