gpt4 book ai didi

c - gcc:编译为 BSS 的线程局部变量

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

我是新手,正在使用 i686/32 位的 Ubuntu 14.04 计算机上使用 gcc(版本 4.8.2)测试线程本地存储 (TLS) 类架构。

在试图找出 __thread 关键字是否有预期的效果时,我用 gcc test.c 编译了这个简约的测试程序(没有错误或警告):

#include <stdio.h>

__thread int i;

int main() {
i = 7;
printf("%d\n",i);
}

并使用工具nm查看目标代码中符号i的存储类:

nm a.out | grep ' i'

结果是

00000000 B i

这意味着 i 被视为一个公共(public)的全局未初始化变量(存储在 BSS 部分)。根据 man nm,线程局部存储变量由字母 L 表示,而不是 B

这里有什么问题吗?

这是 nm 问题还是真正的问题?

最佳答案

没有问题,只是nm(1) 写入输出的方式。

nm(1) 的默认输出格式(和信息)在平台之间是不同的(例如,我的 Linux 桌面上的 nm(1) 的联机帮助页没有甚至不要提及用于线程本地存储的 L

但是,如果您使用 -fs 启用 SysV 输出格式,您会得到更详细的输出:

$ nm -fs a.out
Symbols from a.out:

Name Value Class Type Size Line Section

...

i |0000000000000000| B | TLS|0000000000000004| |.tbss
...

如您所见,使用此输出格式 i 被标识为 Type 列下的线程本地,它位于 .tbss.

如果您的发行版的联机帮助页提到线程本地存储的 L 标志,而您没有在默认输出格式中看到它,我会说这是 nm 中的错误(1).

关于c - gcc:编译为 BSS 的线程局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32415662/

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