.bss 与 COMMON:什么去了哪里?

2024-03-13

来自我的书:

.bss:

未初始化的全局 C 变量

COMMON:

尚未分配的未初始化数据对象

我不得不说,我并没有看到明显的区别。我什至不太明白什么是未初始化、未分配的数据对象......似乎什么都没有。我用过 GNUreadelf工具尝试查看一些简单的 C 代码,但找不到单个 COMMON 符号。我读过像 FORTRAN's COMMON type is an example of a COMMON symbol 这样的东西 - 但我不知道 FORTRAN

有人可以帮我区分这两者吗?如果可能的话,希望有一个 C 示例吗?不胜感激。

edit: from this https://stackoverflow.com/questions/5443474/what-is-the-section-for-uninitialized-global-data发布,变量 c 在这里:

int c;
int main() {} ...

应该是常见的。但使用objdump -t向我显示 c 在 .bss 中...

confused


// file a.c
// file-scope

int a = 0;  // goes into BSS

编译后a.c进入目标文件a.o, a符号进入 BSS 部分。

// file b.c
// file-scope

int b;  // goes into COMMON section

编译后b.c进入目标文件b.o, b符号进入 COMMON 部分。

链接后a.o and b.o, both a and b符号进入 BSS 部分。公共符号只存在于目标文件中,不存在于可执行文件中。 Unix 中 COMMON 符号的思想是在某些条件下允许在单个公共符号下对同一个变量(在不同的编译单元中)进行多个外部定义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.bss 与 COMMON:什么去了哪里? 的相关文章

随机推荐