CSAPP 中的“未初始化的全局变量获得弱符号”这句话准确吗?

问题描述 投票:0回答:1

在《计算机系统:程序员的视角》(CSAPP)中,书中提到“未初始化的全局变量会得到弱符号”。经过一番实验,我发现这个描述似乎与实际发生的情况不一致。 这就是我所做的:

创建一个C文件

main.c

:

__attribute__((weak)) int var1;
int var2;
int var3 = 1;

int main()
{
    return 0;
}

使用 GCC 
-fcommon

选项编译它:

gcc -fcommon -c main.c -o main.o

使用
readelf -s

查看符号表:

symbol content outputed by readelf -s 我们可以看到:

    var1
  • WEAK
    ,这是合理的,因为我明确将其声明为
    WEAK
  • var3
  • GLOBAL
    ,这也是合理的,因为它是初始化的。
    
    
  • 有趣的部分是:
var2

GLOBAL
(与
CSAPP
的说法相反,未初始化的全局变量得到弱符号),并且它被放置在COMMON块中。
所以我的问题是:

    CSAPP
  • 错了吗?还是我误解了书中的“强弱”说法? WEAK符号和COMMON符号有什么区别、关系、优先级?如果两个文件中有两个符号被定义为 WEAK 和 COMMON 并且名称相同怎么办?
  • 感谢您的关注,如果您对这个主题有任何其他见解,我将不胜感激。

c gcc linker elf loader
1个回答
0
投票
-fcommon

(GCC 版本 10 之前的默认设置),未初始化的全局变量 var2 放置在 COMMON 部分,允许跨文件进行多个定义。

enter image description here 使用

-fno-common

(GCC 10 及更高版本中的默认值),未初始化的全局变量 var2 不再放置在 COMMON 部分中。相反,它被赋予一个特定的节索引,被视为强符号,如果相同的变量名称在多个文件中出现未初始化,则可能会导致链接器错误。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.