是否有可能(在合理范围内)建立一个玩具"使用llmv / clang(以及其他"普通"构建工具)的Mac上的操作系统?通过"玩具" OS,我的意思是简单的," Hello,World"在OSDev(http://wiki.osdev.org/Bare_Bones)和x86 Bare Metal(https://github.com/cirosantilli/x86-bare-metal-examples)上找到的示例。
我的主要问题是我无法弄清楚如何准确指定链接器应放置代码的位置(即,起始点应为0x7c00,字节510和511需要为0xaa55等)
答案 0 :(得分:1)
我会说是的,这是有可能的,至少如果你考虑等待lld(和它的依赖llvm)的构建是合理的。可以在website或this答案的一部分找到构建lld的说明。
使用clang编译和链接不同于主机的目标相对容易。您只需要为ELF二进制文件设置目标,例如-target i386-none-elf
。使用clang的交叉编译将更详细地解释here。
对于macOS,正如Micheal Petch所说,你必须使用另一个链接器,而不是安装的标准ld。理论上你可以安装binutils来获得ELF ld,但是你必须自己编译它来设置目标。我的建议是使用lld,它可以针对许多架构而无需重新编译。
有了clang和lld,我们可以使用
编译源代码clang -c -o file.o file.c -target i386-none-elf # freestanding flags omitted
然后将它们与
链接起来clang -o kernel.bin file.o -target i386-linux-elf -nostdlib -Wl,linkerscript.ld -fuse-ld=lld
请注意,对于我正在使用i386-linux-elf
的链接,因为clang中存在一个错误,他们只是将输入转发到gcc
。但是当使用-nostdlib
时,它基本上是相同的。
如果您想查看准备构建的完整示例,可以查看https://github.com/Henje/x86-Toy-OS。