首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

用 ARM 反彙編分析 C 程序內存佈局:.data .bss .rodata .text 實戰

     編輯:關於C語言

用 ARM 反彙編分析 C 程序內存佈局:.data .bss .rodata .text 實戰

通過 arm-linux-objdump -D 反彙編 ELF 文件,可直觀觀察變量在各段的分布。本文以一個綜合示例演示全局/靜態變量、常量、字面量的歸屬規律。

測試代碼

#include <stdio.h>
#define VAR 0xFF
int a = 0;
static int b = 0;
int c = 10;
static int d = 20;
const int finalone = 10;
const int final;
int main(void) {
    char *hell = "hhhhhhh";
    const int finaltwo = 50;
    static int f = 0;
    static int k = 10;
    int aa;
    int bb = 10;
    printf("VAR = %d\n, finalone = %d, finaltwo = %d", VAR, finalone, finaltwo);
}

關鍵段落分析

.data 段(初始化非零全局/靜態變量)

Disassembly of section .data:
00011028 :       11028: 0000000a
0001102c :       1102c: 00000014
00011030 :  11030: 0000000a
  • c(全局初始化 10)、d(static 初始化 20)、k(static 初始化 10)位於此段。
  • 規則:全局或 static 修飾 且 初始值非零。

.bss 段(未初始化或初始化為零的全局/靜態變量)

Disassembly of section .bss:
0001103c :       1103c: 00000000
00011040 :  11040: 00000000
00011044 :   11044: 00000000
  • a(全局 0)、b(static 0)、f(static 0)、final(未初始化 const)均在 .bss。
  • 規則:全局或 static 修飾 且 (未初始化 || 初始化為 0)。編譯器不分配實際空間,僅記錄符號與大小,加載時由系統清零。

.rodata 段(只讀數據:字符串字面量、全局 const 初始化常量)

Disassembly of section .rodata:
0000848c :  848c: 0000000a
8490: 68686868 ...  // "hhhhhhh"
  • finalone(全局 const 初始化 10)、字符串 "hhhhhhh" 存放於此。
  • 規則:全局 const 初始化常量、字符串字面量。內存只讀,多處引用共享同一拷貝。

.text 段(代碼段)與立即數

83fc: e3a010ff  mov r1, #255   ; #define VAR 0xFF → 立即數嵌入指令
83cc: e3a03032  mov r3, #50    ; const int finaltwo = 50 → 棧上分配,運行時賦值
  • #define 宏在預處理階段文本替換,編譯為立即數,直接嵌入指令流,佔用 .text 空間,每處使用一份拷貝。
  • const 變量在編譯期確定值,存儲於 .rodata/.bss,運行期只有一份拷貝,有類型檢查。

核心差異總結

特性#define 宏const 常量
處理階段預處理(文本替換)編譯(符號表)
內存分布立即數,分散在 .text集中在 .rodata/.bss,單一拷貝
類型安全無類型有類型
調試可見性不可見(符號表無)可見

理解這些分布規律,對嵌入式優化內存佔用、定位符號衝突、逆向分析極具指導意義。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved