【问题标题】:GCC weak attribute on variable declaration变量声明的 GCC 弱属性
【发布时间】:2017-04-06 23:34:30
【问题描述】:

在 GCC 中,如果使用 weak 属性声明变量,并且在(静态)链接时没有找到定义,则该变量将具有地址 ,即,如果用变量的地址初始化指针,则指针为NULL,如下面的sn-ps代码所示:

foobar.c

extern int foo __attribute__((weak));
extern int bar;

int *a[] = {&foo, &bar};

main.c:

#include <diag/Trace.h>

//int foo;
int bar;
extern int *a[];

int main(void) {
    trace_printf("%p, %p", a[0], a[1]);
    return 0;
}

输出为:0, 0x20000120 (我使用的是 arm-none-eabi-gcc 5.4.1)

问题是:虽然行为是预期的,但没有文件提到它。谁能指出我解释这种行为的任何材料?谢谢!

【问题讨论】:

    标签: c gcc linker attributes weak


    【解决方案1】:

    我不认为我会期望这一点,我认为 GCC 会做同样的事情,就好像不存在弱属性一样。文档是:

    https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes

    ...所以这看起来像是未记录/未定义的行为。

    【讨论】:

    • 但这就是 GCC 的实际行为方式,因此可以说这也是 GCC 的作者所期望的。它也在 IAR 中实现,正如其手册中明确指出的那样:“链接器不会......,也不会缺少弱引用的定义导致错误。如果不包含定义,则对象的地址将是零。”
    • 不,如果这是他们期望它总是做的事情,他们会记录下来。这就是未记录/未定义的意思,它仍然会做 something 并且那件事可能对您有用......但它可能并不总是这样做。
    猜你喜欢
    • 1970-01-01
    • 2022-09-23
    • 2012-06-26
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2014-03-29
    相关资源
    最近更新 更多