FrOS极简内核Makefile编译标记含义与跨编译工具替换问题咨询
Makefile相关问题解答
问题1:x86_64-elf-ld相关疑问
x86_64-elf-ld是面向x86_64架构、目标格式为ELF的交叉链接器,属于GNU binutils工具集,专门用于在非x86平台生成x86架构的二进制程序,避免宿主系统原生链接器的默认配置干扰裸机程序编译。- 仅用ld可以输出.o格式的可重定位目标文件,添加
-r参数即可实现,.o属于中间产物,通常不直接作为可执行文件使用。 - 链接器不仅能输出库文件,完全可以生成自包含的可执行文件。你平时用gcc直接输出可执行程序,本质是gcc后台自动调用ld完成了链接步骤:编译器只负责把源码转换为中间目标文件,最终可执行文件的地址重定位、依赖拼接都是链接器完成的,包含main函数的可执行文件也不例外。
问题2:kernel.bin链接规则相关疑问
能不能替换为原生ld
如果你使用的是x86_64架构的Linux设备,且系统安装了32位编译支持组件,直接把x86_64-elf-ld替换为原生ld即可正常使用。
规则参数完整解释
x86_64-elf-ld -m elf_i386 -o $@ -Ttext 0x1000 $^ --oformat binary
-m elf_i386:-m用于指定链接的目标架构,elf_i386表示生成32位x86架构的ELF格式目标-Ttext 0x1000:确实是指定代码段的加载基地址为0x1000,这个地址需要和引导程序中加载内核的内存地址严格匹配-o $@:指定输出文件名,$@是Makefile自动变量,代指当前规则的目标文件(也就是kernel.bin)$^:Makefile自动变量,代指当前规则的所有依赖文件,此处就是kernel_entry.o和kernel.o--oformat binary:指定输出纯二进制格式,不带ELF头、段表等额外元信息,适配裸机运行的要求
问题3:nasm编译规则参数解释
nasm $< -f elf -o $@
-f是nasm的输出格式指定参数elf表示输出32位ELF格式的可重定位目标文件,只有该格式的.o文件才能和C语言编译生成的.o文件被链接器正常识别、合并。
问题4:其余参数及xxd工具解释
相关标记含义
-m32:gcc参数,指定生成32位x86架构的目标代码-b:ndisasm参数,-b 32表示按32位指令模式反汇编二进制文件-f:分场景生效:nasm中用于指定输出格式;gcc中以-f开头的参数属于功能开关类参数-ffreestanding:gcc参数,告知编译器当前编译目标为无操作系统依赖的裸机程序,不存在标准库运行时,不会做依赖标准库的优化,也不强制要求main函数作为入口-fda:qemu参数,指定后续的文件作为虚拟软盘驱动器的镜像加载运行
xxd工具作用
xxd是十六进制查看工具,可以将二进制文件转换为「十六进制编码+对应ASCII字符」的对照格式输出,方便直接查看镜像文件的原始内容。
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

