相信大家对makefile都不陌生,在Linux下编写程序基本都离不开makefile的编写,我们都知道多个.c文件经过编译器编译后得到多个.o文件,这些文件是互相独立的,但最终我们要得到一个可正常运行的文件,很显然这个过程就是连接,将多个.o文件连接为一个文件,这个文件是.elf文件。下面来举个例子说明以下。

test.elf : part1.o part2.o
gcc -o test.elf part1.o part2.o //这种写法虽然太过原始,但能说明问题即可 %.o : %.c
gcc -o part1.o part2.o -c part1.c part2.c

上面gcc -o part1.o part2.o -c part1.c part2.c  这步将.c文件编译成对应的多个文件,注意-c表示只编译不连接,然后通过gcc -o test.elf part1.o part2.o连接为一个.elf文件,对于gcc而言,没有-c就意味着默认编译链接,这样就得到了一个文件,这是在PC机上运行的程序,但如果在ARM裸机上编写,那应该怎么实现了。

在ARM上裸机开发过程就变得复杂了,因为编译连接过程gcc已经帮你完成了,所以就不需要去管了,但是裸机就不一样了,这个连接过程我们还的去告诉编译器去做什么,幸运的是ARM开发下有一套完整的工具链,这个就是arm-linux-,这个工具链有三个最常用的工具,arm-linux-gcc   arm-linux-linker   arm-linux-objcopy

第一个工具是编译.c文件或者.s文件的,其输出文件为.o文件,第二个是连接器,是将多个.o文件连接为一个.elf文件的,最后一个工具是j将.elf文件转换为.bin文件以便烧录到Flash去的,下面用一个具体的例子说明三个工具的用法:

整个工程有.main.c hello.c hello.h main.lds文件:

#Makefile file
src=main.o hello.o
targ=main.bin #生成需要的二进制文件
armcc=arm-linux-gcc
armlin=arm-linux-ld
armobj=arm-linux-objcopy $(targ) : $(src)
armlin -Tmain.lds -o main.elf $^
armobj -O binary -S main.elf $@ %o : %c
armcc -o $@ -c $< .PHONY:clean
clean:
rm -f *.o *.elf

前面定义的变量就只替换的作用,其中

armlin -Tmain.lds -o main.elf  $^

意思是将.main.o hello.o文件连接为一个main.elf文件,那按什么方式连接呢,这里用了-T就是说自定义连接过程,这个main.lds就是我们自己定义的连接方式,-o就是输出文件,这里需要注意的是-T后直接接着main.lds文件,中间没有空格,

armobj -O binary -S main.elf $@

意思是将main.elf文件转换为main,bin文件,-O表示输出文件格式,后面接的是binary表示二进制文件,-S是源文件,注意-O和-S都有大写,

armcc -o $@ -c $<

意思是将依赖文件的第一个文件编译为目标文件,其-c表示只编译不连接,因为连接过程在第一个。

下面来说main.elf文件:

SECTIONS{

        . = 0X000; #表示起始地址,即连接时将该文件的首地址放在哪
. = ALIGN();#表示四个字节对齐,比如如果地址在0x3,则会自动移到0x4
.text :
{
*(.text)
} . = 0x100; #注意.后面有空格
. = ALIGN(); #注意.后面有空格
.data : #注意.后面没有空格
{
*(.data)
} .bss :
{
*(.bss)
}
} #特别注意 .text : 中text与:之间有空格,这个必须有空格,否则编译出错
#同样.data和.bss也是一样

Makefile入门的更多相关文章

  1. vim+makefile入门编辑,编译,差错实例

    vim+makefile入门编辑,编译,差错实例 vim makefile 编译 编写代码,一般在vim中编辑完后,输入:wq,在命令行下输入g++ hello.cc -o hello ,出现问题,打 ...

  2. 30天自制操作系统(二)汇编语言学习与Makefile入门

    1 介绍文本编辑器 这部分可直接略过 2 继续开发 helloos.nas中核心程序之前的内容和启动区以外的内容先不讲了,因为还涉及到一些软盘方面的知识. 然后来讲的是helloos.nas这个文件 ...

  3. Makefile 入门(加减乘除实现)

    Makefile 入门(加减乘除实现) 准备 使用任意Linux发行版即可,本文使用WSL Ubuntu. 开始之前,需要安装必要的工具: sudo apt install make g++ 开始 1 ...

  4. 挑战30天写操作系统-day2-汇编语言学习与Makefile入门

    1.介绍文本编辑器 这里,我们直接采用自己windows电脑自带的文本编辑器即可以完成制作要求 2.继续开发 下面先是对昨天使用的helloos.nas文件内容进行详细解释 ; hello-os ; ...

  5. Makefile 入门与基本语法 分类: C/C++ ubuntu 2015-05-18 11:16 466人阅读 评论(0) 收藏

    在我看来,学会写简单的Makefile,阅读较复杂的makefile,是每一个Linux程序员都必须拥有的基本素质.Makefile可以自动识别哪些源文件被更改过,需要重新编译,那些不需要.从而节省大 ...

  6. makefile入门-初步了解

    自己开始学习makefile是由于VScode配置工程文件,看别人的配置不是很懂,于是决定入门学习下makefile. 先来说说makefile是做什么用的:makefile可以实现工程的自动化编译, ...

  7. Makefile入门教程

    Makefile介绍 make是一个命令工具,它解释Makefile 中的指令(应该说是规则).在Makefile文件中描述了整个工程所有文件的编译顺序.编译规则.Makefile 有自己的书写格式. ...

  8. [ARM-LInux开发]linux设备驱动makefile入门解析

    以下内容仅作参考,能力有限,如有错误还请纠正.对于一个普通的linux设备驱动模块,以下是一个经典的makefile代码,使用下面这个makefile可以完成大部分驱动的编译,使用时只需要修改一下要编 ...

  9. Makefile入门1

    Linux中的编译脚本Makefile的讲解设计 概念 编译控制脚本(.c.h----->bin) Makefile最终要的是清晰编译链接的整个过程 Makefile的优化设计 工作原理 mak ...

随机推荐

  1. vue仿淘宝订单状态的tab切换效果

    <div class="navigation">  //这里是通过循环遍历出来的数据,你需要根据index的值来判断你现在点击的是第几个tab栏导航,同时在js中写一个 ...

  2. Android 开发 深入理解Handler、Looper、Messagequeue 转载

    转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/73484527 本文已授权微信公众号 fanfan程序媛 独家发布 扫一扫文章底 ...

  3. delete content on the right of cursor, Mac

    delete content on the right of cursor, Mac It's not convenient to press Fn+delete to delete content ...

  4. 04 Python数据类型

    Python 数据型1. int: 1,2,3 ....2. bool: True False3. str: 存贮少量数据 'asjkdh','工查'4. list: 列表,存贮大量数据 [1,2,3 ...

  5. [Linux] traceroute 路由跟踪指令用例

    traceroute是用来跟踪数据包到达网络主机所经过的路由工具.在Linux系统中,称之为traceroute,在Windows中称为tracert. 一条路径上的每个设备traceroute要测3 ...

  6. 查看oracle的执行计划

    基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划,本文就如何看懂执行计划,以及如何通过分 ...

  7. netty(一) netty有哪几部分构成

    netty netty是一个支持高并发的非阻塞I/O框架. Channel Channel 是 NIO 基本的结构.它代表了一个用于连接到实体如硬件设备.文件.网络套接字或程序组件,能够执行一个或多个 ...

  8. HDU-1078.FatMouseandCheese(线性dp + dfs)

    本题大意:在一个n * n的迷宫内进行移动,左上角为初始位置,每次可以走的步数不能超过m,并且每次走的方格上面的数字要大于前一次走的放个数字,不能走到格子外面,问如何能使得到的数字和最大. 本题思路: ...

  9. input date 支持placeholder属性

    第一种解决方法:IE,火狐浏览器,不支持input date的日历功能,火狐支持日历功能   ie,火狐,谷歌显示placeholder属性 css代码 #dateofday:before{  col ...

  10. Git常用命令及场景

    Git命令推送到远程分支 1.登录GitHub创建一个远程仓库. https://github.com 2.git init 本地创建一个目录,并初始化一个git仓库. 3.git add 添加文件到 ...