1

我正在阅读 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?能推荐几本好书吗?

谢谢!

4

2 回答 2

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

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

  3. 这条线表示xv6.img依赖于bootblock kernel fs.img. 那就是我们说make,为了构建xv6.img,你需要先构建bootblock kernelfs.img

您可以在此处了解 dd 命令

这是完整的百科全书make指南Makefiles

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

于 2012-03-19T05:50:10.087 回答
1

为了增加答案,该dd命令的作用类似于复制命令,本质上是获取输入文件 [if] 并将其内容复制到输出文件 [of]。计数是要复制的块数的指示符。

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

于 2021-02-19T17:51:27.483 回答