【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 文件里可以直接找到初始值。

相关推荐
小雪崩6 分钟前
嵌入式学习 day60:ARM汇编——触摸屏与SPI
汇编·arm开发·学习
M78佐菲5 小时前
ARM学习笔记(12)
linux·arm开发·笔记·嵌入式硬件·学习
sunoo-2296 小时前
【嵌入式 ARM 学习第十二天】SPI 裸机驱动 + I2C 触摸屏驱动 + 三大串行协议深度对比
arm开发·笔记·vscode·学习·imx6ull
ARM&开发(Haidong)7 小时前
ARM DMA硬件和驱动原理
arm开发
AOI小白新手上路7 小时前
4-3_ARM汇编_学习笔记
汇编·arm开发·学习
kkkkkkkkkk_Z8 小时前
新手自学嵌入式 | 学习日记:ARM架构初探与基础概念梳理
arm开发·学习·架构
SKH.8 小时前
ARM-lcd屏幕点亮
arm开发
傲世仙尊10 小时前
序列化与自定义协议-把结构体拆成字节流再拼回来
linux·服务器·网络·arm开发
脚踏实地,坚持不懈!10 小时前
Linux 内核源码解析:从 secondary_startup_64 到 pick_eevdf 的完整调用栈分析
android·linux·arm开发
斑马13910 小时前
ARM学习笔记(七)——LCD液晶显示
arm开发·笔记·学习