一般情況下,一個彙編來源程式需要定義3個段:
.text
.data
.bss
這個源自UNIX的傳統(和a.out的結構有關)。
不過在現在的LINUX裡,這三個部分不叫“段”(segment),而叫作“區”(section)。
這可能和Linux使用ELF(Execution and Linking Format)有關吧:
一個ELF格式的可執行程式通常劃分為如下幾個部分:
.text、.data 和 .bss,其中
.text 是唯讀代碼區,
.data 是可讀可寫的資料區,
.bss 則是可讀可寫且沒有初始化的資料區。
代碼區和資料區在ELF中統稱為section,根據實際需要你可以使用其它標準的section,也可以添加自訂section,但一個 ELF 可執行程式至少應該有一個.text 部分。
彙編(器)指示:
來源程式裡的這些以“.”英文句點開頭的.text,.data,.bss等是用來向組譯工具傳遞資訊的,叫做“彙編(器)指示”。
.text告訴彙編器,其後的內容屬於代碼區,唯讀屬性。
.data告訴彙編器,其後的內容屬於具有初值的資料區,可讀可寫。
.bss告訴彙編器,其後的內容屬於不具有初值的資料區,可讀可寫。
當彙編器遇到一個新的聲明某個區的彙編指示時,老的區就結束了,同時開始一個新的區。
.text,.data,.bss等彙編指示是可以多次反覆出現的。
此外還有其他一些特定的區:
.rdata
存放唯讀資料(常量),英文叫做read-only data。
MIPS還有專門的預設使用$gp定址的區:
.sdata
具有初值的小資料區,可讀可寫。英文叫做small data。
.sbss
不具有初值的資料區,可讀可寫。英文叫做small common objects.
.lit8
存放64位浮點數(implicit-constant)。
.lit4
存放32位浮點數(implicit-constant)。
.sdata,.sbss,.lit8,.lit4都預設使用$gp定址。
相同類型的區最後都會被串連程式按類型合并到一起,在可執行檔裡組成單一的.text區,.data區和.bss區。