You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置-Ttext为末尾含0的地址时ELF的.text段消失问题咨询

RISC-V ZSBL开发问题:-Ttext地址末尾为0时.text段消失的原因

我在开发基于RISC-V架构的ZSBL(零阶段引导加载程序)时遇到一个奇怪的问题:当通过-Ttext指定的地址末尾为0(比如0x300000、0x3000100这类),生成的ELF文件里的.text段就会消失;但地址末尾非0时,.text段又会出现。这是怎么回事?


正常情况:-Ttext设置为0x2000000001时的readelf输出

执行命令:

$ riscv64-unknown-elf-as -c zsbl_cp_jmp.S -o zsbl_cp_jmp.o  
$ riscv64-unknown-elf-ld -Ttext 0x2000000001  -nostdlib zsbl_cp_jmp.o -o zsbl_cp_jmp.elf

readelf输出:

There are 7 section headers, starting at offset 0x11e8:

Section Headers:
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        0000002000000001 001001 000003 00  AX  0   0  1
  [ 2] .init             PROGBITS        00000000000100b0 0000b0 00004c 00  AX  0   0  1
  [ 3] .riscv.attributes RISCV_ATTRIBUTES 0000000000000000 001004 00002e 00      0   0  1
  [ 4] .symtab           SYMTAB          0000000000000000 001038 000120 18      5   4  8
  [ 5] .strtab           STRTAB          0000000000000000 001158 000056 00      0   0  1
  [ 6] .shstrtab         STRTAB          0000000000000000 0011ae 000039 00      0   0  1

异常情况:-Ttext设置为0x2000000000时的readelf输出

执行命令:

$ riscv64-unknown-elf-ld -Ttext 0x2000000000  -nostdlib zsbl_cp_jmp.o -o zsbl_cp_jmp.elf

readelf输出:

There are 6 section headers, starting at offset 0x290:

Section Headers:
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .init             PROGBITS        0000000000010078 000078 00004c 00  AX  0   0  1
  [ 2] .riscv.attributes RISCV_ATTRIBUTES 0000000000000000 0000c4 00002e 00      0   0  1
  [ 3] .symtab           SYMTAB          0000000000000000 0000f8 000108 18      4   3  8
  [ 4] .strtab           STRTAB          0000000000000000 000200 000056 00      0   0  1
  [ 5] .shstrtab         STRTAB          0000000000000000 000256 000033 00      0   0  1

源代码

.section .init

.global _start
_start:
    li      a0, 0x2000010000
    li      a1, 0x2000030000
    li      a2, 0x20000
    li      t0, 0
1:
    bge     t0, a2, 1f
    add     t1, a1, t0
    lb      t1, 0(t1)
    add     t2, a0, t0
    sb      t1, 0(t2)
    addi    t0, t0, 1
    j       1b
1:
    li t3, 0x2000010000
    jr t3

原因分析

  1. 你的所有代码都放在了.init段里,并没有显式编写.text段的内容。
  2. -Ttext选项的作用是告诉链接器设置默认的.text段起始地址,即使没有输入内容,链接器有时也会生成一个极小的占位.text段(比如第一个案例中大小为3的段)。
  3. 当你指定的地址末尾为0时,这个地址通常满足严格的对齐要求(比如4字节对齐、页对齐),链接器会检测到这个占位的.text段没有实际功能,于是在最终ELF中直接优化掉了它。
  4. 而当地址末尾非0时,这个地址不符合常规的对齐规则,链接器无法对这个占位段进行优化,因此保留了它。

实际上你完全不用在意这个.text段的存在与否——你的核心代码都在.init段里,只要.init段正常存在、地址正确,就不会影响ZSBL的运行。如果需要强制控制.text段的生成,可以通过编写自定义链接脚本来实现。


内容的提问来源于stack exchange,提问作者Just a little noob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:45:21