文章目录
- 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 段名 的情况是正常的,主要原因在于 链接脚本或段合并。