使用-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
相关产品推荐
相关产品推荐

