【ARM 嵌入式 编译系列 10.4.3 -- 查看 bss 段在bin 文件中存在吗?】
文章目录
- Overview
- 1. BSS 段在 ELF 中的特点
- 2. 转换成 binary 文件时
- 3. 系统运行时 BSS 如何处理
Overview
通过链接脚本生成的 elf 然后在通过 objcopy 生成 binary文件中有bss段中的内容吗?如果有,那么如何从 bin 文件中找到 bss 中的值,比如某个静态变量的值
1. BSS 段在 ELF 中的特点
-
BSS (Block Started by Symbol) 段用于存放 未初始化的全局/静态变量。
-
在 ELF 文件里,BSS 段只会在 Program Header (PT_LOAD) 里占用地址空间,但不会有实际的存储内容。
-
所以在 ELF 的 Section Header Table 里能看到
.bss
,但是它的Size
大于 0,而FileOffset
往往是 0(即不会在文件中占字节)。
2. 转换成 binary 文件时
当你用:
objcopy -O binary xxx.elf xxx.bin
-
objcopy
会把 ELF 中的 实际有内容的段(比如 .text, .data, .rodata …)拷贝到 bin 文件。 -
BSS 段不会被拷贝,因为它在 ELF 中没有实际数据。
-
所以在生成的 bin 文件里,你是看不到
.bss
段的内容的。
3. 系统运行时 BSS 如何处理
在程序启动(比如 crt0
或者裸机启动代码)里,启动代码会:
-
根据链接脚本,知道
.bss
段的起始地址和大小。 -
在初始化阶段,用
memset
或循环把这段内存清零。extern char __bss_start__; extern char __bss_end__;void clear_bss(void) {for (char *p = &__bss_start__; p < &__bss_end__; p++) {*p = 0;} }
所以在运行时,所有未初始化的静态/全局变量默认值为 0。
在 binary 文件中有 bss 段的内容吗?
没有,bin 文件里没有 bss 的内容。
如果有某个静态变量的值,怎么在 bin 里找到?
-
如果是 未初始化的静态变量 → 它属于
.bss
,所以在 bin 文件里看不到,运行时才由启动代码清零。 -
如果是 有初始值的静态变量 → 它属于
.data
或者.rodata
,在 bin 文件里可以直接找到初始值。