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

相关推荐
ShiMetaPi20 小时前
GM-3568JHF丨ARM+FPGA异构开发板系列教程:外设教程 04 WIFI
网络·arm开发·fpga开发·智能路由器·fpga
切糕师学AI21 小时前
ARM 架构中的浮点寄存器(Floating-Point Registers)
arm开发·寄存器·浮点寄存器
再遇当年1 天前
因为研究平台arm,RK3588交叉编译误把我笔记本X86平台的/x86_64-linux-gnu文件删除,导致联想拯救者笔记本中的ubuntu系统损坏
linux·arm开发·ros·gnu·交叉编译·x86
切糕师学AI1 天前
ARM 架构中的 CONTROL 寄存器
arm开发·硬件架构·嵌入式·芯片·寄存器
richxu202510012 天前
嵌入式学习之路>单片机核心原理篇>(14) ARM 架构
arm开发·单片机·学习
切糕师学AI2 天前
ARM 汇编指令:LDR
汇编·arm开发
亿道电子Emdoor2 天前
【Arm】解决Keil MDK报错提示找不到编译器路径的问题
arm开发
cooldream20093 天前
RISC-V 全景解析:在 x86 与 ARM 之间,理解开放指令集的真正价值
arm开发·risc-v
切糕师学AI4 天前
ARM 架构中的数据内存屏障指令 DMB
arm开发·架构·指令·内存屏障
森焱森5 天前
GD32F4 DSP
linux·c语言·arm开发·驱动开发·嵌入式硬件