You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

裸二进制格式与独立环境下的.bss段处理问题

裸机环境下ELF转二进制后.bss段与全局变量的问题

二进制输出中.bss段的去向

  • 当你把链接输出格式改成二进制(比如用objcopy -O binary命令转换),最终的二进制文件不会包含.bss段。原因很简单:ELF里的.bss段本来就没实际数据,只记录了它要占用的内存大小和起始地址——它是给加载器留的标记,用来在运行时分配一块清零的内存。转二进制时,工具只会把有实际内容的段(比如存代码的.text、存初始化数据的.data)打包进去,.bss的空间不会被写入文件。
  • 不过你得在链接脚本里明确给.bss段分配好内存位置。二进制文件加载到内存后,这块内存区域是存在的,但里面是随机值,需要你自己在启动代码里手动清零。

裸机环境用全局变量的注意事项

  • 对于未初始化(或初始化为0)的全局/静态变量:这些会被放到.bss段,裸机没有系统加载器帮你清零,所以必须在启动代码里自己实现清零逻辑——一般是通过链接脚本定义的__bss_start和__bss_end符号,遍历这段内存把每个字节设为0,不然变量会是内存里的随机垃圾值,肯定会搞砸程序逻辑。
  • 对于已初始化的全局/静态变量:这些存在.data段里,它们的初始值会被包含在二进制文件里(通常存在Flash这类只读存储里)。启动时你得把.data段的内容从加载地址复制到运行地址(比如RAM),之后才能正常用,不然读出来的也是错的。
  • 只要你在启动代码里把这两步(.bss清零、.data复制)做好,全局变量就能正常用,不会有问题——本质就是把系统加载器干的活自己手动实现了而已。

内容的提问来源于stack exchange,提问作者Viliam Holly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:22:03