【问题标题】:Makefile of xv6xv6 的 Makefile
【发布时间】:2012-03-19 05:32:18
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: c linux makefile xv6


    【解决方案1】:
    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命令here

    这是makeMakefiles 的完整百科指南

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-22
        • 2015-06-09
        相关资源
        最近更新 更多