[英]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? 你能推荐一些好书吗?
谢谢!
CFLAGS
是您传递给编译器CC
的选项(如-fno-stack-protector
-E
等)。 $(CC)
将被实际的编译器替换。 即CC
应该在此之前使用set CC=gcc
类的东西进行初始化。
LDFLAGS
是选项(对于您的链接器LD
。 +=
就像您在 C 中的+=
运算符一样。它更新为CFLAGS
和LDFLAGS
现有值
这一行意味着xv6.img
依赖于bootblock
kernel
fs.img
。 那就是我们告诉make
,为了构建xv6.img
,你需要先构建bootblock
kernel
和fs.img
您可以在此处了解 dd 命令
这是关于make
和Makefiles
的完整百科全书指南
为了补充答案, dd
命令的行为就像一个复制命令,本质上是获取输入文件 [if] 并将其内容复制到输出文件 [of]。 计数是要复制的块数的指示符。
您提供的代码与 xv6.img 文件的构建有关,该文件包含引导加载程序、文件系统和内核。 该代码实质上是将 10000 个零块从 /dev/zero 文件复制到 xv6.img 中。 然后从引导块(由 Makefile 目标看到的 bootasm.S 和 bootmain.c 创建)复制到扇区 0。然后寻找一个扇区,然后将内核复制到映像文件中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.