文章目录
- Overview
 - 
- [1. 两个工具作用不同](#1. 两个工具作用不同)
 - [2. 为什么会出现 size 有 data,而 readelf 没有 .data](#2. 为什么会出现 size 有 data,而 readelf 没有 .data)
 - [3. 怎么验证](#3. 怎么验证)
 - 总结
 
 
Overview
在 使用 llvm-size -B 和 llvm-readelf -S 分别对 elf 文件进行作用,但是一个输出是有data 段的数据的,一个输出却显示没有data 段数据,这里主要是记录下 为什么 llvm-size -B 能看到 .data 段大小,而 llvm-readelf -S 可能显示没有 .data 段。
1. 两个工具作用不同
- 
llvm-size -B统计 ELF 中的段大小,显示结果是 合并统计值:
- 
.text段归到text列 - 
.data段归到data列 - 
.bss段归到bss列 
 - 
 
它不管段是否真的叫 .data,只要是 可写+初始化的段 ,都会合并到 data 列里。
llvm-readelf -S
打印 ELF 文件段表 (Section Header Table) ,直接显示 ELF 里定义的段名字。
如果 ELF 里没有显式的.data段(比如优化、链接脚本合并到了别的段),那么llvm-readelf -S就不会显示.data。
2. 为什么会出现 size 有 data,而 readelf 没有 .data
可能有几种情况:
- 
链接脚本把
.data合并到了别的段例如链接脚本里写了:
ld.mydata : { *(.data) *(.sdata) }那么
.data就不再单独存在,而是放进.mydata段里。
llvm-size依旧会把它算到data区域,而llvm-readelf -S就不会看到.data了。 - 
编译优化没生成
.data如果你的代码里没有 已初始化的全局/静态变量 ,那么
.data段可能不会生成。
llvm-size此时显示data = 0,readelf也可能直接没有.data段。 - 
不同工具对"data"的定义不同
llvm-size并不是单纯看段名叫.data,而是看它是否是 分配在内存里且可写的已初始化段 。所以即便 ELF 段名是.fw_data_table或.sdata,也会被统计到data里。 
3. 怎么验证
你可以这样对比:
            
            
              bash
              
              
            
          
          llvm-size -B demo.elf
llvm-readelf -S demo.elf | grep -E '\.data|\.sdata|\.mydata|\.rodata'
        再用:
            
            
              bash
              
              
            
          
          llvm-nm -S demo.elf | grep ' D '
        这里 D 表示符号在 data 段。
总结
- 
llvm-size -B→ 逻辑分类(text/data/bss 总览) - 
llvm-readelf -S→ 实际段名(受链接脚本影响) - 
所以出现 一个有 data,一个没有 .data 段名 的情况是正常的,主要原因在于 链接脚本或段合并。