C语言链接器中*(.text)与*(.text*)的区别及相关段疑问
链接器脚本中
.text与.text*类段匹配语法的差异 核心差异说明
*(.text):仅匹配**名称完全为.text**的段,这是标准代码段,绝大多数普通函数、全局代码都会被编译到该段中。*(.text*):匹配所有以.text开头的段,既包含.text本身,也涵盖.text.startup、.text.exit、.text.some_function这类带后缀的特殊段。很多编译器会把初始化代码、终止代码或特殊标记的函数放到这类衍生段里。
扩展到.bss、.rodata等段的情况
该通配符规则对其他段类型完全适用:
*(.bss):仅匹配名称严格为.bss的未初始化全局/静态变量段;*(.bss*)则匹配.bss.heap、.bss.stack这类细分的未初始化数据段。*(.rodata):仅匹配只读数据段(如字符串常量、const变量);*(.rodata*)会匹配.rodata.str1.1、.rodata.cst4这类编译器自动生成的细分只读段。
为什么会出现.text*这类段
以ARM平台的arm-none-eabi-gcc为例,编译器会根据代码特性自动拆分段:
- 启动相关代码(如
_start)可能被放到.text.startup,优化时会给这类段单独设置内存属性或加载优先级。 - 编译器内置函数、经特殊优化后的函数会被放到带后缀的
.text衍生段,方便链接器做更精细的内存布局控制。 - 你在
arm-none-eabi-objdump中看到的.text*形式的段,就是编译器这类自动拆分的结果。
内容的提问来源于stack exchange,提问作者mohammadsdtmnd
相关产品推荐
相关产品推荐

