繁体   English   中英

xv6 的 Makefile

[英]Makefile of xv6

我正在阅读 xv6 的代码,发现很难阅读 Makefile。 你能告诉我以下语句是如何工作的吗:

1. "CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)"
2. "LDFLAGS += -m $(shell $(LD) -V | grep elf_i386 2>/dev/null)"
3. "xv6.img: 
bootblock kernel fs.img 

dd if=/dev/zero of=xv6.img count=10000

dd if=bootblock of=xv6.img conv=notrunc

dd if=kernel of=xv6.img seek=1 conv=notrunc"

以及如何详细学习Makefile? 你能推荐一些好书吗?

谢谢!

  1. CFLAGS是您传递给编译器CC的选项(如-fno-stack-protector -E等)。 $(CC)将被实际的编译器替换。 CC应该在此之前使用set CC=gcc类的东西进行初始化。

  2. LDFLAGS是选项(对于您的链接器LD+=就像您在 C 中的+=运算符一样。它更新为CFLAGSLDFLAGS现有值

  3. 这一行意味着xv6.img依赖于bootblock kernel fs.img 那就是我们告诉make ,为了构建xv6.img ,你需要先构建bootblock kernelfs.img

您可以在此处了解 dd 命令

这是关于makeMakefiles的完整百科全书指南

http://www.gnu.org/software/make/manual/make.html

为了补充答案, dd命令的行为就像一个复制命令,本质上是获取输入文件 [if] 并将其内容复制到输出文件 [of]。 计数是要复制的块数的指示符。

您提供的代码与 xv6.img 文件的构建有关,该文件包含引导加载程序、文件系统和内核。 该代码实质上是将 10000 个零块从 /dev/zero 文件复制到 xv6.img 中。 然后从引导块(由 Makefile 目标看到的 bootasm.S 和 bootmain.c 创建)复制到扇区 0。然后寻找一个扇区,然后将内核复制到映像文件中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM