设置-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
原因分析
- 你的所有代码都放在了
.init段里,并没有显式编写.text段的内容。 -Ttext选项的作用是告诉链接器设置默认的.text段起始地址,即使没有输入内容,链接器有时也会生成一个极小的占位.text段(比如第一个案例中大小为3的段)。- 当你指定的地址末尾为0时,这个地址通常满足严格的对齐要求(比如4字节对齐、页对齐),链接器会检测到这个占位的
.text段没有实际功能,于是在最终ELF中直接优化掉了它。 - 而当地址末尾非0时,这个地址不符合常规的对齐规则,链接器无法对这个占位段进行优化,因此保留了它。
实际上你完全不用在意这个.text段的存在与否——你的核心代码都在.init段里,只要.init段正常存在、地址正确,就不会影响ZSBL的运行。如果需要强制控制.text段的生成,可以通过编写自定义链接脚本来实现。
内容的提问来源于stack exchange,提问作者Just a little noob
相关产品推荐
相关产品推荐

