gpt4 book ai didi

c - GCC -O2 和 __attribute__((weak))

转载 作者:太空狗 更新时间:2023-10-29 15:34:39 25 4
gpt4 key购买 nike

看起来带有 -O2__attribute__((weak)) 的 GCC 会根据您引用弱符号的方式产生不同的结果。考虑一下:

$猫弱.c

#include <stdio.h>

extern const int weaksym1;
const int weaksym1 __attribute__(( weak )) = 0;

extern const int weaksym2;
const int weaksym2 __attribute__(( weak )) = 0;

extern int weaksym3;
int weaksym3 __attribute__(( weak )) = 0;

void testweak(void)
{
if ( weaksym1 == 0 )
{
printf( "0\n" );
}
else
{
printf( "1\n" );
}

printf( "%d\n", weaksym2 );


if ( weaksym3 == 0 )
{
printf( "0\n" );
}
else
{
printf( "1\n" );
}
}

$猫测试.c

extern const int weaksym1;
const int weaksym1 = 1;

extern const int weaksym2;
const int weaksym2 = 1;

extern int weaksym3;
int weaksym3 = 1;

extern void testweak(void);

void main(void)
{
testweak();
}

$制作

gcc  -c weak.c
gcc -c test.c
gcc -o test test.o weak.o

$./测试

1
1
1

$ 制作 ADD_FLAGS="-O2"

gcc -O2 -c weak.c
gcc -O2 -c test.c
gcc -O2 -o test test.o weak.o

$./测试

0
1
1

问题是,为什么最后一个“./test”产生“0 1 1”,而不是“1 1 1”?

gcc 版本 5.4.0 (GCC)

最佳答案

看起来在进行优化时,编译器在处理声明为 const 的符号和在同一编译单元中具有 weak 定义时遇到了问题。

您可以创建一个单独的 c 文件并将 const weak 定义移到那里,它将解决该问题:

weak_def.c

const int weaksym1 __attribute__(( weak )) = 0;
const int weaksym2 __attribute__(( weak )) = 0;

此问题中描述的相同问题:GCC weak attribute on constant variables

关于c - GCC -O2 和 __attribute__((weak)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43177223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com