首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XC8编译器支持弱符号吗?

XC8编译器支持弱符号吗?
EN

Stack Overflow用户
提问于 2017-05-19 17:14:00
回答 2查看 522关注 0票数 0

gcc有__attribute__((weak)),它允许创建一个弱符号,例如一个函数。这允许用户重新定义函数。我希望在XC8中有同样的行为。

更多信息:

我正在为XC8编写一个驱动程序,我希望将低级别初始化委托给用户定义的函数。

我知道可以重新定义一个函数:在XC8的源文件中实现并由printf函数调用的putch函数。允许用户在应用程序中重新实现putch。有两个名称相同的函数,但没有引发错误。

putch在XC8源文件中的实现有一条评论说“实现弱,可能需要用户实现”,所以这是可能的。

我看了XC8的用户指南中的语用,但是没有关于这个问题的指示。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-19 17:28:37

链接器只会搜索静态库来解析输入对象文件尚未解析的符号,因此可以在不弱链接的情况下替换静态库函数。弱链接对于作为源代码或目标代码提供的代码是有用的,而不是作为静态库。

因此,如果不支持弱链接指令,则可以为“弱”符号创建静态库并将其链接起来。

XC8手册记录了IAR兼容性指令__weakweak实用化的行为,在这两种情况下,这些指令都被忽略(仅在XC16和XC32中支持),因此您必须使用上述建议的方法,这在任何情况下都要更便携--如果有点不方便的话。

putch()的情况下,我怀疑这不像您所相信的那样有效。我可以想象,这根本不是弱链接的问题;在包含printf()的静态库中,存在一个指向putch()的未解决的链接,并且链接器使用您提供的任何内容来解析它;如果要编译和链接微芯片实现和源代码链接,您将得到一个链接器错误;同样,如果您不提供任何实现,您将得到一个链接器错误。

票数 2
EN

Stack Overflow用户

发布于 2020-08-02 12:38:31

XC8编译器确实支持“弱”属性。

弱属性导致声明作为弱符号发出。弱符号表示,如果同一符号的全局版本可用,则应使用该版本。当弱属性应用于对外部符号的引用时,链接不需要该符号。

例如:

代码语言:javascript
复制
extern int __attribute__((weak)) s;

int foo(void) 
{
    if (&s)
        return s;
    return 0;   /* possibly some other value */
}

在上面的程序中,如果s不是由其他模块定义的,程序仍然会链接,但不会给s地址。条件验证已经定义了s(如果定义了,则返回它的值)。否则返回“0”。此功能有许多用途,主要用于提供可与可选库链接的通用代码。

变量也可以使用“弱”属性进行限定。

例如:

代码语言:javascript
复制
char __attribute__((weak)) input;
char input __attribute__((weak));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44075604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档