【ARM 嵌入式 编译系列 10.4.3 -- 查看 bss 段在bin 文件中存在吗?】

文章目录

  • Overview
    • [1. BSS 段在 ELF 中的特点](#1. BSS 段在 ELF 中的特点)
    • [2. 转换成 binary 文件时](#2. 转换成 binary 文件时)
    • [3. 系统运行时 BSS 如何处理](#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 文件时

当你用:

bash 复制代码
objcopy -O binary xxx.elf xxx.bin
  • objcopy 会把 ELF 中的 实际有内容的段(比如 .text, .data, .rodata ...)拷贝到 bin 文件

  • BSS 段不会被拷贝,因为它在 ELF 中没有实际数据。

  • 所以在生成的 bin 文件里,你是看不到 .bss 段的内容的。

3. 系统运行时 BSS 如何处理

在程序启动(比如 crt0 或者裸机启动代码)里,启动代码会:

  1. 根据链接脚本,知道 .bss 段的起始地址和大小。

  2. 在初始化阶段,用 memset 或循环把这段内存清零。

    c 复制代码
    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 文件里可以直接找到初始值。

相关推荐
ARM+FPGA+AI工业主板定制专家7 小时前
基于ARM+FPGA+AI的船舶状态智能监测系统(二)软硬件设计,模拟量,温度等采集与分析
arm开发·人工智能·目标检测·fpga开发
梅尔文.古9 小时前
ADCU-Ethernet-以太网在AUTOSAR与Linux架构下对比
arm开发·单片机·汽车
szxinmai主板定制专家10 小时前
基于ZYNQ MPSOC船舶数据采集仪器设计(一)总体设计方案,包括振动、压力、温度、流量等参数
arm开发·人工智能·嵌入式硬件·fpga开发
坤坤藤椒牛肉面12 小时前
ARM基础内容
arm开发
szxinmai主板定制专家14 小时前
基于ZYNQ MPSOC船舶数据采集仪器设计(三)振动,流量,功耗,EMC,可靠性测试
arm开发·人工智能·嵌入式硬件·fpga开发
忆和熙19 小时前
ARMv8异常级别与执行状态的转换机制(ARMv8异常机制——异常处理中,执行状态与异常级别的转换机制)
arm开发·arm异常
ARM+FPGA+AI工业主板定制专家21 小时前
基于ARM+FPGA+AI的船舶状态智能监测系统(一)总体设计
网络·arm开发·人工智能·机器学习·fpga开发·自动驾驶
梦..2 天前
Allegro学习记录(一)
arm开发·单片机·嵌入式硬件·学习·硬件架构·硬件工程·pcb工艺
EnglishJun2 天前
ARM嵌入式学习(七)--- 汇编基础(数据指令、函数调用原理、中断原理)
arm开发·学习
Nan_Feng_ya2 天前
基于STM32的智能手表复刻成功(完全开源)
arm开发·stm32·pcb工艺·智能手表