1、有一处错误。59页第三行:
[code]
所以.bss段只是为未初始化的全局变量和局部静态变量预留位置而已。
[/code]
并且配了图,全局的未初始化变量int global_uninit_var;用点虚线连到.bss section
实测结果发现是错的。
只有静态的未初始化变量会预留位置。非静态的全局变量不会预留。
测试代码bss.c
[code]
int a;
int main(){
return 0;
}
[/code]
头信息显示,.bss的Size为0
[code]
bss.o: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000000b 0000000000000000 0000000000000000 00000040 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 0000000000000000 0000000000000000 0000004c 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 0000000000000000 0000000000000000 0000004c 2**2
ALLOC
3 .comment 0000002d 0000000000000000 0000000000000000 0000004c 2**0
CONTENTS, READONLY
4 .note.GNU-stack 00000000 0000000000000000 0000000000000000 00000079 2**0
CONTENTS, READONLY
5 .eh_frame 00000038 0000000000000000 0000000000000000 00000080 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
[/code]
把全局变量改为全局静态变量时,才会到.bss段
[code]
static int a;
int main(){
return 0;
}
[/code]
头信息显示,.bss的Size为4,一个int的大小,四个字节。
[code]
bss.o: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000000b 0000000000000000 0000000000000000 00000040 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 0000000000000000 0000000000000000 0000004c 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000004 0000000000000000 0000000000000000 0000004c 2**2
ALLOC
3 .comment 0000002d 0000000000000000 0000000000000000 0000004c 2**0
CONTENTS, READONLY
4 .note.GNU-stack 00000000 0000000000000000 0000000000000000 00000079 2**0
CONTENTS, READONLY
5 .eh_frame 00000038 0000000000000000 0000000000000000 00000080 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
[/code]
从书中给的例子也能看出来这个问题,61页的代码里分别有一个未初始化的全局变量和一个未初始化的静态局部变量。按作者的理解,这两个int的大小应该是8。
从62页书中给出的头信息来看,.bss段的大小是4。作者不知道什么原因,没有注意到这个问题。
- 阅读剩余部分 -