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

使用-Trodata选项时LD未移动.rodata段的问题排查

x86内核开发:.rodata段重定位失效问题

我正在开发x86内核,使用字符串字面量时遇到了问题:gcc会把字符串字面量放到.rodata段里,但我没把这个段加载到内存中。我尝试通过-Trodata 0x00009400参数指定该段的地址,之后用objdump提取该段加入内核镜像,但readelf显示ld完全没对这个段做重定位。另外,设置-Tdata和-Ttext地址重叠时ld会报错,但-Trodata和其他段地址重叠却没有任何报错,就像这个参数被忽略了一样。

内核能正确加载.text和.data段的数据,但主函数引用字符串字面量时,指向的是ld默认的.rodata偏移地址,而不是我指定的0x00009400。我查看了Binutils仓库里ld的源码,没找到问题所在,只是猜测ld可能期望段名是rodata-section而非rodata,但不确定。谷歌搜索也没找到有效的解决方案。

我的Makefile代码:

kernel: kernel/init.c kernel/preinit.asm
    gcc -ffreestanding -fno-pie -g -c kernel/init.c -m32 -o object/kernelinit.o
    nasm -g -f elf32 ./kernel/preinit.asm -o object/kernelpreinit.o
    ld -e kernelInit -Ttext 0x00007E00 -Tdata 0x00009200 -Trodata 0x00009400 object/kernelpreinit.o object/kernelinit.o -o build/kernel.elf
    objcopy -O binary -j.text build/kernel.elf build/kernel_text
    objcopy -O binary -j.data build/kernel.elf build/kernel_data
    objcopy -O binary -j.rodata build/kernel.elf build/kernel_rodata

相关现象说明:

查看readelf输出可见,.text和.data段的偏移地址符合指定值,但.rodata段的偏移地址是ld默认值,并非0x00009400。

内容的提问来源于stack exchange,提问作者TheYolocast

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:37:26