C bss中的28个额外字节
当我运行上述程序时,.bss部分有64个字节。我希望它是36字节。mystruct使用32字节,其他库使用4字节 如果我将C bss中的28个额外字节,c,memory-management,C,Memory Management,当我运行上述程序时,.bss部分有64个字节。我希望它是36字节。mystruct使用32字节,其他库使用4字节 如果我将char cc[32]更改为char cc[31],则在.bss中获得36个字节 struct abc { char cc[32]; } mystruct; int main() { } 64是十六进制的000040 为什么.bss中有这些额外的28字节 readelf输出的最后一列是alignment,显示的值实际上是“32”。因此,BSS大小被四舍五入到32字
char cc[32]
更改为char cc[31]
,则在.bss中获得36个字节
struct abc
{
char cc[32];
} mystruct;
int main()
{
}
64是十六进制的000040
为什么.bss中有这些额外的28字节 readelf输出的最后一列是alignment,显示的值实际上是“32”。因此,BSS大小被四舍五入到32字节的最接近倍数。objdump-sSx a.out产生的结果,以及其他一些东西
-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$
第24项,在“Algn”项下,我们看到2**5或2^5 aka 32。这表明bss是以32字节块分配的,因为它是32位对齐的。objdump-t a.out | grep bss为您提供
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 0000001c 0000000000400238 0000000000400238 00000238 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 0000000000400254 0000000000400254 00000254 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .note.gnu.build-id 00000024 0000000000400274 0000000000400274 00000274 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .gnu.hash 0000001c 0000000000400298 0000000000400298 00000298 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .dynsym 00000048 00000000004002b8 00000000004002b8 000002b8 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .dynstr 00000038 0000000000400300 0000000000400300 00000300 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .gnu.version 00000006 0000000000400338 0000000000400338 00000338 2**1
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 .gnu.version_r 00000020 0000000000400340 0000000000400340 00000340 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .rela.dyn 00000018 0000000000400360 0000000000400360 00000360 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 .rela.plt 00000018 0000000000400378 0000000000400378 00000378 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
10 .init 00000018 0000000000400390 0000000000400390 00000390 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
11 .plt 00000020 00000000004003b0 00000000004003b0 000003b0 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .text 000001c8 00000000004003d0 00000000004003d0 000003d0 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .fini 0000000e 0000000000400598 0000000000400598 00000598 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
14 .rodata 00000004 00000000004005a8 00000000004005a8 000005a8 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
15 .eh_frame_hdr 0000002c 00000000004005ac 00000000004005ac 000005ac 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
16 .eh_frame 000000a4 00000000004005d8 00000000004005d8 000005d8 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
17 .ctors 00000010 0000000000600e28 0000000000600e28 00000e28 2**3
CONTENTS, ALLOC, LOAD, DATA
18 .dtors 00000010 0000000000600e38 0000000000600e38 00000e38 2**3
CONTENTS, ALLOC, LOAD, DATA
19 .jcr 00000008 0000000000600e48 0000000000600e48 00000e48 2**3
CONTENTS, ALLOC, LOAD, DATA
20 .dynamic 00000190 0000000000600e50 0000000000600e50 00000e50 2**3
CONTENTS, ALLOC, LOAD, DATA
21 .got 00000008 0000000000600fe0 0000000000600fe0 00000fe0 2**3
CONTENTS, ALLOC, LOAD, DATA
22 .got.plt 00000020 0000000000600fe8 0000000000600fe8 00000fe8 2**3
CONTENTS, ALLOC, LOAD, DATA
23 .data 00000010 0000000000601008 0000000000601008 00001008 2**3
CONTENTS, ALLOC, LOAD, DATA
24 .bss 00000040 0000000000601020 0000000000601020 00001018 2**5
ALLOC
25 .comment 0000002a 0000000000000000 0000000000000000 00001018 2**0
CONTENTS, READONLY
预期大小为32字节(00000020十六进制)。在
.bss
中,不仅仅是您的代码。你确定里面没有其他内容吗?可能.bss
只扩展为32字节的块或其他内容。你可能需要调查一下ELF规范来找出答案……我是唯一一个还在想当OP将数组大小更改为31时我们是如何得到36字节的人吗?(考虑到36显然不是32的倍数)谢谢。。。。如果它是32字节对齐的,那么为什么我看到下面代码的输出是36-bash-3.00$cat bssSize.cc struct abc{char cc[31];}mystruct;int main(){}-bash-3.00$g++bssSize.cc-bash-3.00$size--format=sysv./a.out | grep bss.bss 36 134518136-bash-3.00$
08049660 l d .bss 00000000 .bss
08049660 l O .bss 00000001 completed.5745
08049660 g *ABS* 00000000 __bss_start
08049680 g O .bss 00000020 mystruct