如何用代码验证 const 全局变量存在.rodata 段?

发布时间:2026/6/11 3:53:26
如何用代码验证 const 全局变量存在.rodata 段? 全程你只需要做 3 步写一段测试代码编译用readelf或objdump查看段信息1. 测试代码直接复制test.c// 全局 const → 放入 .rodataconstintglobal_const100;// 普通全局变量 → 放入 .dataintglobal_var200;intmain(){return0;}2. 编译不优化方便观察gcc-ctest.c-otest.o-c只编译不链接生成目标文件test.o。3. 查看变量在哪个段核心验证方法 A使用readelf最清晰readelf-stest.o你会看到类似输出Num: Value Size Type Bind Vis Ndx Name 5: 0000000000000000 4 OBJECT GLOBAL DEFAULT 4 global_const 6: 0000000000000000 4 OBJECT GLOBAL DEFAULT 3 global_var重点看Ndx段索引global_const→ 在段号4global_var→ 在段号3再看段表readelf-Stest.o你会看到[ 3] .data [ 4] .rodata✅结论const 全局变量 → .rodata✅普通全局变量 → .data方法 B使用objdump更直观objdump-ttest.o输出直接写清楚0000000000000000 g O .rodata 0000000000000004 global_const 0000000000000000 g O .data 0000000000000004 global_var看到了吗global_const在.rodataglobal_var在.data4. 进阶验证尝试修改 const 全局变量 → 段错误#includestdio.hconstinta100;// .rodataintmain(){int*p(int*)a;*p200;// 试图修改只读段数据printf(%d\n,a);return0;}编译运行gcc test.c-otest./test结果Segmentation fault (core dumped)✅原因.rodata 是操作系统保护的只读段写入直接崩溃最简洁总结面试一句话const 全局变量→ 编译后放入.rodata 只读数据段普通全局变量→ 放入.data 数据段可用readelf -s/objdump -t直接查看符号所在段修改 .rodata 变量会触发段错误SIGSEGV最终超级精简版你只需要记住这条命令就能立刻验证objdump-ttest.o|grepglobal输出会直接告诉你.rodata global_const .data global_var