注:
本格式适用于 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
