注:
本格式适用于 ELF Version 。
https://sourceware.org/binutils/docs/as/Section.html

基本语法格式

基本语法格式,英文描述:

.section name [, "flags"[, @type][,flag_specific_arguments]]]

基本语法格式,中文描述:

.section 段名 [, 标志字符] [, 类型] [, 标志特定参数]

注:
name 段名 必需
flags 可选项
type 可选项
flag_specific_arguments 可选项

name(段名)

标准段名

标准段名,又称特殊段名,因为其有着固定类型。

  • .text //代码段
  • .data //数据段
  • .rodata //只读数据段
  • .bss //BSS段

标准段名常用于 简写指令:

.text           # 代码段(等同于 .section .text.data           # 已初始化数据段 (等同于 .section .data.rodata         # 只读数据段(等同于 .section .rodata.bss            # 未初始化数据段(等同于 .section .bss

自定义段名

简单的自定义段名

# 自定义 代码段
.section .my_code_section, "ax", %progbits
    mov r0, #1
    bx lr

# 自定义 数据段
.section .my_data_section, "aw", %progbits
my_data:
    .word 0x12345678

# 自定义 只读段
.section .my_constants, "a", %progbits
PI:
    .float 3.1415926

带层次的段名(常见于实际项目)

# 特定功能的代码段
.section .text.fast_math, "ax", %progbits
fast_sin:
    # 快速正弦函数实现

.section .text.slow_math, "ax", %progbits  
slow_sin:
    # 精确正弦函数实现

# 特定类型的数据
.section .data.initial_values, "aw", %progbits
init_values:
    .word 1, 2, 3, 4

# 可合并的字符串段
.section .rodata.str1.1, "aMS", %progbits, 1
msg_hello:
    .asciz "Hello, World!"

flag(段标志字符)

标志字符

标志字符 含义 说明
a allocatable 可分配(加载到内存)
w writable 可写
x executable 可执行
t TCM 紧耦合内存
d 可丢弃 可被丢弃
M mergeable 可合并段(文档实际为大写)
S contains zero terminated strings 包含以零结尾的字符串(文档实际为大写)
e excluded 从可执行文件和共享库中排除(文档实际为小写)
G member of a section group 段组的成员(文档实际为大写)
o has a (non-zero) element/entry size 具有(非零)元素/条目大小(文档实际为小写)

常用组合

# 代码段(可分配、可执行)
.section .text, "ax", %progbits

# 数据段(可分配、可写)
.section .data, "aw", %progbits

# 只读数据(可分配)
.section .rodata, "a", %progbits

# BSS 段(可分配、可写、不占文件空间)
.section .bss, "aw", %nobits

type(类型)

  • @progbits
    含义:”section contains data”(段包含数据
    用途:用于包含实际程序数据的段
    常见场景
    代码段(.text
    已初始化数据段(.data
    只读数据段(.rodata

  • @nobits
    含义:”section does not contain data (i.e., section only occupies space)”(段不包含数据只占用空间
    用途:用于 BSS 段(未初始化数据)
    特点:不占用目标文件空间,只在运行时分配内存
    常见场景
    BSS 段(.bss
    栈、堆空间定义

  • @note
    “section contains data which is used by things other than the program”(段包含程序之外使用的数据)

  • @init_array
    包含初始化函数指针数组

  • @fini_array
    包含析构函数指针数组

  • @preinit_array
    包含预初始化函数指针数组

flag_specific_arguments参数

在文档中,flag_specific_arguments 是与特定标志(flags)相关的额外参数,其含义取决于所设置的标志。文档中明确说明了以下情况:

特定标志对应的参数

如果需要了解,详见: https://www.softool.cn/read/gnuarmasm/flag_specific_arguments.html

补充

常用段类型

代码段

.section .text, "ax", %progbits
# 或简写
.text

数据段

.section .data, "aw", %progbits
# 或简写
.data

BSS 段(未初始化)

.section .bss, "aw", %nobits
# 或简写
.bss

只读数据

.section .rodata, "a", %progbits
# 或简写
.section .rodata