c - xv6 的 Makefile

标签 c linux makefile 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是您传递给编译器的选项(如 -fno-stack-protector -E 等)CC . $(CC)将被实际的编译器取代。即CC应该在此之前用 set CC=gcc 之类的东西初始化.

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

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

可以了解dd命令here

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

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

关于c - xv6 的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9765443/

相关文章:

c++ - 获取内存段信息

c - free(ptr) where ptr is NULL 会损坏内存吗?

linux - 为什么 Linux rpm 是特定于操作系统的

vim - 在不退出 Vim 的情况下调用不同目录中的 Makefile

c - 为什么 long long 和 int 相乘会产生溢出?

c - 指针 "char **strData"指向哪里?

使用 Valgrind 检查内存

c - 在 Fedora 上的 make menuconfig 中编译 Linux 时出错

c - "make clean"的任务配置在 Visual Studio 2017 中不起作用

makefile - makefile 和 CMakeList 之间的主要区别是什么