struct abc
{
char cc[32];
} mystruct;
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
当我运行上面的程序时,.bss部分有64个字节.我原以为它是36个字节.mystruct为32个字节,其他库为4个字节.
如果我char cc[32]改为char cc[31]那么我在.bss中得到36个字节.
-bash-3.00$ g++ bssSize.cc
-bash-3.00$ readelf --sections ./a.out | grep bss
[23] .bss NOBITS 08049580 000578 000040 00 WA 0 0 32
-bash-3.00$
Run Code Online (Sandbox Code Playgroud)
64是十六进制的000040
为什么这些额外的28个字节在.bss中?
.data和.bss的对齐有时是4个字节,有时是32个字节.示例1:根据下面输出的最后一列,bss和数据的对齐是32个字节
bash-3.00$ readelf --sections libmodel.so
There are 39 section headers, starting at offset 0x1908a63c:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
...
[25] .data PROGBITS 01e221e0 1e211e0 26ca54 00 WA 0 0 32
[26] .bss NOBITS 0208ec40 208dc34 374178 00 WA 0 0 32
...
Run Code Online (Sandbox Code Playgroud)
示例2:根据以下输出,对齐os .data和.bss是4个字节
bash-3.00$ readelf --sections ./a.out
There are 28 section headers, starting at offset 0x78c:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
... …Run Code Online (Sandbox Code Playgroud)