共享对象.rodata段字符串字面量行为:strcpy与strncpy编译差异问询
strcpy/strncpy编译后.rodata段差异的原因解析
这个现象是编译器语义分析+代码生成策略共同作用的结果,和两个函数的特性直接相关:
使用
strcpy时:strcpy的语义是完整复制以'\0'结尾的字符串,编译器会判定该字符串常量可直接嵌入到.text段的代码流中——比如拆分成适合指令操作的16字节块,作为指令的立即数或内嵌数据使用,无需单独创建.rodata段存储。即便你用了-g(默认无优化-O0),编译器依然会基于函数语义做这类基础的代码布局优化,目的是减少内存寻址开销。使用
strncpy时:strncpy需要明确处理字符串的长度逻辑,编译器会判定该字符串需作为独立的只读实体存在,因此会将完整的NEW_CONFDIR字符串存入.rodata段,方便函数直接引用其内存地址完成长度计算或复制操作。
如果需要强制将字符串常量放入.rodata,可以尝试两个方案:
- 用
const关键字显式修饰字符串变量 - 添加编译选项
-fno-inline-string-literals禁止字符串常量内联到.text段
内容的提问来源于stack exchange,提问作者DeltaVega
相关产品推荐
相关产品推荐

