Makefile浅尝

【0】README

  • makefile定义: 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要一先编译,哪些文件需要后编译,哪些文件需要重新编译;

【1】看个荔枝

这里写图片描述

荔枝解析-Analysis:

loader.bin : loader.asm include/load.inc include/fat12hdr.inc include/pm.inc $(ASM) $(ASMFLAGS) -o $@ $<
  • A1)比如以上这个makefile的最后两行,翻译出来就是:

    • 1)要想得到loader.bin ,需要执行 $(ASM) $(ASMFLAGS) -o $@ $< ;
    • 2) loader.bin 依赖于 以下文件:loader.asm、 include/load.inc 、include/fat12hdr.inc 、include/pm.inc ;
    • 3)当以上依赖文件 有一个比 loader.bin 新时,command 才被执行;
  • A2)那么 $(ASM) $(ASMFLAGS) -o $@ $< 又表示什么呢?

    $@ 代表 target  == loader.bin;
    $< 代表 prerequisites 的第一个名字  == loader.asm;
    所以,这行就等价于 nasm -o loader.bin loader.asm ;
    
  • A3)后面有冒号的还有:

    # All Phony Targets
    .PHONY : everything clean all
    # Default starting position
    everything : $(TARGET)
    clean :  rm -f $(TARGET) 
    all : clean everything
    

    everything + clean + all 叫做动作名称而已;
    如果运行 make clean, 将会执行 rm -f ${TARGET} == rm -f boot.bin loader.bin

这里写图片描述

  • A4)make everything == make
    因为 直接输入 make的话,这是 make程序 会从第一个名字所代表的动作开始执行, 而第一个动作名称是everything;

这里写图片描述

  • A5) make 指令, 默认的makefile文件是 Makefile,而如果要指定特定的makefile, 加上-f 参数;如make all -f Makefile.boot ;
  • A6) 对头文件目录的指定 -I include ;
  • A7)当要确定文件的依赖关系时,利用 GCC 提供的参数 -M 可以自动生成依赖关系, 然后将依赖关系copy 到 makefile中就可以了;
  • A8)查找依赖关系 gcc 和 nasm 都是用 参数 -M;
    这里写图片描述

【2】我的 Makefile

  • 2.1)荔枝一,我们只编译boot 文件
    这里写图片描述

  • 2.2)荔枝二,编译boot+loader文件,并将loader拷贝到系统软盘
    这里写图片描述
    这里写图片描述

    ASM             = nasm
    BOOT_T          = boot.bin
    IMAGE_T         = a.img
    LOADER_T        = loader.bin
    .PHONY: image clean build_img
    image : ${BOOT_T} ${LOADER_T} build_img
    clean :rm -f $(LOADER_T) ${BOOT_T}           
    # loader : ${LOADER_
    #  boot :       $(BOOT_T)          
    build_img:dd if=boot.bin of=a.img bs=512 count=1 conv=notruncsudo mount -o loop a.img /mnt/floppy/sudo cp -f loader.bin /mnt/floppy/sudo umount /mnt/floppy/      
    boot.bin : boot.asm$(ASM) -o $@ $<
    loader.bin: loader.asm$(ASM) -o $@ $< 
    

  • 2.3)荔枝三,编译boot+loader文件,并将loader拷贝到系统软盘 (注意,这里加入了文件依赖)
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

    ASM             = nasm2 ASMDIR          = boot/include/34 BOOT_T          = boot/boot.bin56 IMAGE_T         = a.img78 LOADER_T        = boot/loader.bin910 .PHONY: image clean build_img1112 image : ${BOOT_T} ${LOADER_T} build_img1314 clean :15         rm -f $(LOADER_T) ${BOOT_T}1617 # loader : ${LOADER_18 #  boot :       $(BOOT_T)1920 build_img:21         dd if=boot/boot.bin of=a.img bs=512 count=1 conv=notrunc22         sudo mount -o loop a.img /mnt/floppy/23         sudo cp -f boot/loader.bin /mnt/floppy/24         sudo umount /mnt/floppy/2526 boot/boot.bin : boot/boot.asm ${ASMDIR}load.inc ${ASMDIR}fat12hdr.inc27         $(ASM) -I ${ASMDIR}  -o $@ $<28 boot/loader.bin: boot/loader.asm ${ASMDIR}fat12hdr.inc ${ASMDIR}load.inc ${ASMDIR}pm.inc29         $(ASM) -I${ASMDIR} -o $@ $<
    

  • 2.4)荔枝四,编译boot+loader文件,并将loader和os kernel 拷贝到系统软盘
    Alert):本Makefile文件很有代表性,参见https://github.com/pacosonTang/Orange-s-OS/blob/master/Makefile
    这里写图片描述
    这里写图片描述

    ASM  = nasmASMDIR   = boot/include/GCC  = gccLD   = ldBOOT_T   = boot/boot.binIMAGE_T = a.imgLOADER_T = boot/loader.binKERNEL_T    = kernel/kernel.o kernel/start.oLIB_T    = lib/kliba.o lib/string.oFINAL_T  = kernel/kernel.bin.PHONY: image clean build_imgimage : ${BOOT_T} ${LOADER_T} ${KERNEL_T} ${LIB_T} ${FINAL_T} build_imgclean :rm -f $(LOADER_T) ${BOOT_T} ${KERNEL_T} ${LIB_T} ${FINAL_T}# loader : ${LOADER_# boot :    $(BOOT_T)build_img:dd if=boot/boot.bin of=a.img bs=512 count=1 conv=notruncsudo mount -o loop a.img /mnt/floppy/sudo cp -f boot/loader.bin /mnt/floppy/sudo cp -f kernel/kernel.bin /mnt/floppy/sudo umount /mnt/floppy/boot/boot.bin : boot/boot.asm ${ASMDIR}load.inc ${ASMDIR}fat12hdr.inc$(ASM) -I ${ASMDIR} -o $@ $<boot/loader.bin: boot/loader.asm ${ASMDIR}fat12hdr.inc ${ASMDIR}load.inc ${ASMDIR}pm.inc$(ASM) -I ${ASMDIR} -o $@ $<kernel/kernel.o: kernel/kernel.asm$(ASM) -f elf -o $@ $<kernel/start.o: kernel/start.c include/type.h include/const.h include/protect.h$(GCC) -I include/ -c -fno-builtin -o $@ $<lib/kliba.o: lib/kliba.asm$(ASM) -f elf -o $@ $<lib/string.o: lib/string.asm$(ASM) -f elf -o $@ $<kernel/kernel.bin: ${KERNEL_T}${LD} -s -Ttext 0x30400 -o $@ ${KERNEL_T} ${LIB_T}
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java类验证和装载顺序_Java类的加载顺序

1、有继承关系的加载顺序关于关键字static&#xff0c;大家 都知道它是静态的&#xff0c;相当于一个全局变量&#xff0c;也就是这个属性或者方法是可以通过类来访问&#xff0c;当class文件被加载进内存&#xff0c;开始初始化的时候&#xff0c;被static修饰的变量或者方法即…

java代码识别_识别Java中的代码气味

java代码识别作为软件开发人员&#xff0c;我们不仅要编写有效的代码&#xff0c;而且还要编写可维护的代码&#xff0c;这是我们的责任。 Martin Fowler在他的《重构&#xff1a;改进现有代码的设计》中将代码气味定义为&#xff1a; 通常对应于系统中更深层问题的表面指示 …

关于Java父子类继承的问题

1.子类无法继承父类的构造器 2.子类可以继承父类所有的变量和方法&#xff0c;父类私有的方法和变量也被继承到子类中&#xff0c;只是不可见而已&#xff0c;子类无法直接调用和访问。在子类对象中存储着父类中所有的变量的数据以及父类所有方法的引用地址。 3.被重写的父类方…

git连接到github(SSH无密码登陆)

【0】README 0.1&#xff09;本文旨在尝试在linux环境下免密码连接到github&#xff0c;并进行push pull projects in github by git commands。0.1&#xff09; 对ssh免密码登录有不熟悉的童鞋&#xff0c;please visit http://blog.csdn.net/pacosonswjtu/article/details/…

excel柱状图堆叠图显示总和_excel堆积柱形图显示百分比 在Excel堆积图中显示百分比标签的方法...

excel堆积柱形图显示百分比 在Excel堆积图中显示百分比标签的方法&#xff0c;前天刚学习了一个excel的新技术&#xff0c;叫“excel堆积柱形图显示百分比”授课老师对我们说&#xff0c;这一技术的专业全称为“excel堆积柱形图显示百分比 在Excel堆积图中显示百分比标签的方法…

java命令模式_Java中的命令设计模式

java命令模式在本教程中&#xff0c;我们将学习命令模式&#xff0c;这是一种重要的行为设计模式。 它具有一些重要的应用程序&#xff0c;例如在文本编辑器中实现撤消/重做功能。 在命令设计模式中&#xff0c;有一个命令对象位于发送方和接收方对象之间。 发送者对象可以创建…

抽象类与接口的区别

文章目录抽象类的理解接口的理解区别分析演示案例总结参考抽象类的理解 动物就是对某类事物的普遍性、共同性进行抽取后得到的用来反映这类事物本质的概念。 动物被定义为靠摄取有机物(植物、动物或微生物&#xff09;来获得营养而不能完成无机物到有机物转化过程的能够对环境…

浅尝硬盘分区表

【0】README 0.1&#xff09; text description from orange’s implemention of a os&#xff1b; 0.2&#xff09; there are a number of analysis and attention proves to be essence of this page, I think; 0.3&#xff09;Conclusion about hd partition table C1…

openjdk-7支持版本_长期支持对OpenJDK意味着什么?

openjdk-7支持版本Bruno Borges最近在推特上发布了一个有关OpenJDK的长期支持&#xff08;LTS&#xff09;的问题&#xff0c;这表明对它的真正含义仍有一些困惑。 在此博客文章中&#xff0c;我将解释不同部分如何组合在一起。 那么……谁说或在哪里说“ #OpenJDK 11”是LTS&…

android 安装卸载应用提醒_Android监听程序的安装和卸载

在android系统中&#xff0c;安装和卸载都会发送广播&#xff0c;当应用安装完成后系统会发android.intent.action.PACKAGE_ADDED广播。可以通过intent.getDataString()获得所安装的包名。当卸载程序时系统发android.intent.action.PACKAGE_REMOVED广播。同样intent.getDataStr…

常用函数式接口的学习

文章目录定义常用的函数式接口Supplier演示代码Consumeraccept 方法演示代码andThen 方法演示代码Predicatetest 方法and 方法演示代码or 方法negate 方法Functionapply 方法演示代码andThen 方法演示代码定义 有且仅有一个抽象方法的接口称之为“函数式接口”&#xff0c;但是…

如何创建虚拟硬盘 + os 读取硬盘参数代码

【0】README 0.1&#xff09; 本文旨在演示如何利用 bximage 创建虚拟硬盘&#xff1b;0.2&#xff09; 利用 os 读取硬盘参数&#xff0c; source code from orange’s implemention of a os , for complete code , please visit https://github.com/pacosonTang/Orange-s-OS…

内联脚本被视为是有害的_数据类被认为有害

内联脚本被视为是有害的这篇博客文章解释了从我参与的项目之一中删除Lombok项目的动机。 它反映了我的个人观点&#xff0c;并不妨碍特定的技术。 大约三年前&#xff0c;我认识了Project Lombok &#xff0c;这是一个添加Java代码的库。 我从一开始就喜欢它&#xff0c;因为它…

win10可用空间变成未分配_教你两种方法有效利用Win10未分配的空间 - 易我科技...

Haley 于2020/08/24更新 磁盘分区管理摘要文中介绍了两种方法充分利用Windows10未分配空间&#xff0c;分别为1)格式化Win10未分配空间来创建新的分区&#xff0c;2)在分区上添加未分配空间。我的Win 10计算机上有一个大小99GB的未分配空间 :「我在Windows计算机上安装了两个硬…

selenium编写脚本_Selenium脚本编写技巧和窍门

selenium编写脚本如果您刚刚开始学习Selenium&#xff0c;则以下技巧和窍门将成为您的救星。 这些技巧和窍门具有您可能会忘记的所有基本知识&#xff0c;将帮助您记住所有这些。 您只需浏览一次&#xff0c;几秒钟后您便会了解所有内容。 让我们一一看一下所有的技巧和窍门。 …

div和div之间画横线_HTML如何在两个div标签中间画一条竖线

近日在画一个界面的时候&#xff0c;遇到一个需求&#xff1a;在界面当中画一条竖线&#xff0c;且这条竖线在高度上需要自动占满整个父div(即这条竖线的高度和两个div中较高的一个等高)。往常我们画一条横线直接用标签即可&#xff0c;当画一条竖线的时候发现找不到标签。在网…

静态类型/静态分派/动态分派/单分派/多分派

文章目录静态类型/实际类型方法解析静态分派动态单分派参考静态类型/实际类型 Human woman new Woman(); // Human就是静态类型&#xff0c;其实就是变量编译时类型&#xff0c;Woman就是实际类型 Man man new Man(); // 静态类型和实际类型都是Man方法解析 Class 文件的编…

jvm回收垃圾_没有垃圾回收的JVM

jvm回收垃圾JVM社区不断增加新的GC&#xff0c;最近又添加了一个新的GC&#xff0c;它被称为Epsilon &#xff0c;是非常特殊的一个。 Epsilon仅分配内存&#xff0c;但不会回收任何内存。 看起来好像不执行任何垃圾回收的GC用途是什么。 这种类型的垃圾收集器有特殊用途&…

C打印函数printf的一种实现原理简要分析

【0】README 0.1&#xff09;本文旨在对 printf 的 某一种 实现 原理进行分析&#xff0c;做了解之用&#xff1b;0.2&#xff09; vsprintf 和 printf.c 的源码&#xff0c;参见 https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/p309 【1】pr…

wireshark提取流量包中的文件_[技术]Wireshark抓取的数据包提取文件

0x00 简介本期主要会教大家如何从流量中还原出来文件。下面我将会用多种办法来讲解。使用系统&#xff1a;Kali Linux0x01 tcpxtract工具网络流量提取文件(方法1)Kali Linux默认没有安装该工具&#xff0c;需要自己安装安装命令&#xff1a;sudo apt install tcpxtract使用方法…