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

相关推荐
一池秋_13 小时前
arm低配linux设备,桌面应用冷启动提速方法
linux·运维·arm开发
qq_402995751 天前
诊断协议栈配置Agent
arm开发·人工智能·stm32·单片机·mcu
一木 之林3 天前
三.C++ 内存管理(进阶)(二)
开发语言·arm开发·c++
hongmai6668884 天前
MP2348GTL-Z:这颗24V/4A同步降压芯片,把性能和体积平衡得恰到好处
c语言·开发语言·arm开发·单片机·5g
隔窗听雨眠5 天前
ARM架构下Logstash与Elasticsearch集群部署完全指南:从环境适配到生产验证
arm开发·elasticsearch·架构
郭老师-嵌入式5 天前
arm linux 移植 udhcp 与 使用
linux·服务器·arm开发
深念Y6 天前
登录日志与管理员审计日志存储决策
前端·arm开发·后端·微服务·云原生·架构
深念Y6 天前
微服务抽取路线图:从胖单体到 ARM 集群
前端·arm开发·数据库·后端·微服务·云原生·架构
亿道电子Emdoor7 天前
【Arm】如何高效实现2兆字节对齐
arm开发·单片机·mcu
姓刘的哦7 天前
STM32的启动流分析
linux·运维·arm开发