gpt4 book ai didi

c++ - 为什么在这些不同的情况下数据/BSS 大小会发生变化?

转载 作者:行者123 更新时间:2023-12-01 14:29:05 25 4
gpt4 key购买 nike

我正在学习虚拟内存管理和进程内存分配。并对此做一些实验。有以下一些容易混淆的地方:

案例1

#include <iostream>

int main() {
return 0;
}

编译代码并使用二进制文件运行 size 后得到以下输出:

   text    data     bss     dec     hex filename
1985 640 8 2633 a49 main

案例2:将代码更改为:

#include <iostream>

int global;

int main() {
return 0;
}

并重建它,大小输出为:

   text    data     bss     dec     hex filename
1985 640 16 2641 a51 main

注意:data内存部分没有变化,只是bss8变成了16这个结果对我来说很有意义,因为 int global 定义了一个未初始化的全局变量。

案例 3:然后我将代码更改为:

#include <iostream>

int global = 5;

int main() {
return 0;
}

我初始化了全局变量。并再次分析二进制文件:

   text    data     bss     dec     hex filename
1985 644 4 2633 a49 main

这一次,这个变化对我来说没有意义。与case1相比,为什么data部分增加了4个字节和bss部分减4?

最佳答案

差异是由链接器及其决定如何布局二进制文件引起的。 x86 上的 G++ 默认链接器 (GNU ld)。

要查看差异,让我们以三种不同的方式编译您的测试用例:

$ for x in *.cpp ; do g++ -g3 $x -o $x.ld.exe ; done                  # GNU ld
$ for x in *.cpp ; do g++ -g3 $x -o $x.gold.exe -fuse-ld=gold ; done # gold
$ for x in *.cpp ; do g++ -g3 $x -o $x.gold.exe -fuse-ld=lld ; done # lld

现在,尺寸如下:

   text    data     bss     dec     hex filename
1873 656 8 2537 9e9 test1.cpp.ld.exe
1873 656 16 2545 9f1 test2.cpp.ld.exe
1873 660 4 2537 9e9 test3.cpp.ld.exe

text data bss dec hex filename
1877 656 2 2535 9e7 test1.cpp.gold.exe
1877 656 9 2542 9ee test2.cpp.gold.exe
1877 660 2 2539 9eb test3.cpp.gold.exe

text data bss dec hex filename
1817 576 2 2395 95b test1.cpp.lld.exe
1817 576 9 2402 962 test2.cpp.lld.exe
1817 580 2 2399 95f test3.cpp.lld.exe

bss 部分的行为可以解释如下:

此处要存储两个或三个变量(completed.0,可能是globalstd::__ioinit)。始终存在的两个,每个都有 1 个字节的大小和对齐方式。仅在情况 2 中存在的全局变量具有 4 个字节的大小和对齐方式。这就是为什么 goldlld 在情况 1 和情况 3 中的 bss 部分都需要 2 个字节。对于情况 2,布局是这样的global 存储在两个单字节值之间,这需要在第一个 1 字节值和 global 之间额外填充 3 个字节。

一般来说,GNU ld 做类似的事情,除了它使用 bss 部分还提供节间填充。在情况1和3中,实际只使用了bss部分的2个字节,而情况2使用了9个字节的bss部分。由于 data 在情况 3 中增加了 4 个字节,并且 bss 位于 data 之后,因此删除了其中的 4 个填充字节以保持以下部分对齐。这也是为什么 bss 部分的大小在引入 global 时增加了 8 个字节而不是 4 个字节:GNU ld 确保部分保持 8 字节对齐。

关于c++ - 为什么在这些不同的情况下数据/BSS 大小会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63432207/

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