64位汇编内核开发:ELF64编译宏报错问题求助
问题原因分析
核心差异:ELF64与二进制格式的地址处理逻辑不同
二进制格式(
-f bin)的特性
NASM编译二进制文件时,所有符号地址都是相对于输出文件起始的绝对偏移,$$代表当前section(bin格式下通常只有一个section)的起始地址(即文件开头)。宏中的表达式BASE_OF_SECTION + %1 - $$可以直接计算出常量:%1 - $$是中断函数符号在文件内的偏移- 加上
BASE_OF_SECTION得到加载后的物理地址 - 再减去硬编码的
1024是原作者特定的地址调整逻辑
整个表达式在编译阶段就能确定数值,因此dw/dd指令可以正常生成机器码,不会报错。
ELF64格式的特性
ELF64是带重定位信息的目标文件格式,符号地址在编译阶段是不确定的,需要链接器最终确定虚拟内存地址(VMA):$$代表当前section的虚拟起始地址,而非文件偏移- 宏中的
BASE_OF_SECTION + %1 - $$涉及符号%1的虚拟地址,这是一个重定位符号,无法在编译阶段计算出常量值 dw/dd指令要求立即数必须是编译期可确定的常量,因此NASM会抛出重定位相关的错误(比如relocation truncated to fit)
宏本身的硬编码问题
宏中硬编码的-1024是原作者针对自己的加载流程设置的偏移,但在ELF64模式下,内核的加载地址通常由链接脚本指定,这种硬编码的地址调整逻辑与ELF的重定位机制冲突,进一步加剧了编译错误。
内容的提问来源于stack exchange,提问作者Miky
相关产品推荐
相关产品推荐

