天天看點

Linux bss segment, data segment, text segment and stack segment , heap segment introduce

1. Now we study linux compile, we found that when we use "readelf -S" we can read the symbol in the exe.

 我們會發現在 在程式中會有 data bss text 和 read data 以及 heap stack 等段的概念。下面我們詳細的講一下個段的存放的那些變量。

  text 段: 存放的是指令 為隻讀的 不可在運作是 改變    --- 占用code size的大小

  data 段: 存放 初始化的全局變量 初始化為0和NULL的除外(包括 初始化的靜态全局變量) 和 初始化的 局部靜态變量  -- 占用code size

  bss 段: 存放 未初始化的全局變量(包括初始化成0 NULL)和 未初始化的 局部靜态變量。 --不占用code size 他隻進路所有bss的總的大小。在程式運作時 reserve 這麽大的 空間。

字元串常量: 一般存放在text 段

read data 段: 在data段中 隻不過存放的是常量資料。

下面我們講一下static 修飾符的作用。

  static 作用:

   1. 改變 變量的存儲區(從 stack 上提到 bbs 或者data 段) 在局部變量上加一個static 修飾符就是這個作用。 雖然這個變量的作用域 還是在這個 局部區域 但當這個作用與失效時 這個變量的值依然存在(符号已經被登出了)。

 例如: 

     void test1(void)

     {

        static int a = 9; 

         int b = 8;

              // 雖然在test1 調用結束後, 符号 a,和符号 b 都不在符号表裡了。但是a 的這個值9 還存在。 這就函數傳回值的引用。

     }

   2. 限制作用域   加上 static 的全局變量 的作用與就不是全工作目錄 就變成的定義他的檔案又有效了。

      static int a;

      int c;

     void test()

  {

  }

  a 就隻有在這個檔案有效。

 c 可以全工程有效。

注意static 和extern 是互相排斥的。

繼續閱讀