XC8 编译器是否支持弱符号?

Does XC8 compiler support weak symbols?

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

更多信息:

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

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

putch在XC8的源文件中的实现有注释说"Weak implementation. User implementation may be required",所以一定是可以的。

我在XC8的用户指南中查看了pragmas,但是没有与这个问题相关的指令。

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

因此,如果不支持弱 linkage 指令,您可以为 "weak" 符号和 link 创建一个静态库。

XC8 manual 记录了 IAR 兼容性指令 __weakweak pragma 的行为,在这两种情况下指令都被忽略(仅在 XC16 和 XC32 中支持),所以你将不得不使用上面建议的方法,在任何情况下都更便携 - 如果有点不方便。

putch() 的情况下,我怀疑这并不像您认为的那样有效。我想这根本不是link年龄弱的问题;在包含 printf() 的静态库中,存在未解析的 link 到 putch(),并且 linker 会使用您提供的任何内容解析它;如果您要从源代码编译和 link Microchip 实现和您的实现,您将得到一个 linker 错误;同样,如果您不提供任何实现,您将收到 linker 错误。

XC8 编译器支持“weak”属性。

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

例如:

extern int __attribute__((weak)) s;

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

在上面的程序中,如果s没有被其他模块定义,程序仍然link但是s不会被赋予地址。 条件验证 s 是否已定义(如果有,则 returns 它的值)。否则返回“0”。 此功能有很多用途,主要是提供可以 link 带有可选库的通用代码。

变量也可以用“weak”属性限定。

例如:

char __attribute__((weak)) input;
char input __attribute__((weak));