[Linux]数码相框&电子书(五)Makefile分析
[Linux]数码相框&电子书(五)
艾恩凝
2021/8/16
GNU ARM 命令行工具
编译器 arm-linux-gcc
1、编译步骤
1.1 预处理阶段
编译器把上述代码中stdio.h编译进来,使用GCC的选项-E可以使GCC在预处理结束后停止编译过程,而不继续其他动作了。
1.2 编译阶段
首先检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,arm-linux-gcc把代码翻译成汇编语言。用户可以使用-S选项来进行查看,该选项只编译而不进行汇编,生成汇编代码。
1.3 汇编阶段
把编译阶段生成.s文件转成目标文件,使用者可使用选项-c就可产生.o文件了** **
1.4 链接阶段
系统把printf等函数的实现都做到名为lib.so.6的库文件中去了(或者采用精通连接时有的.a文件中),在没有特别指定时,arm-linux-gcc会到系统默认的搜索路径下进行查找,也就是链接到lib.so.6库函数中去,这样就能实现函数printf了,而这也是链接的作用。
2、arm-linux-gcc 常用命令行选项
2.1、-o 表示要求编译器产生所指定文件名的文件,因为默认的可执行文件名是a.out
2.2、-L 指定链接时
2.3、-I 指定头文件.h的搜索目录
2.4、-l 正常链接只会用libc这个函数库,其他函数库需要用这个命令指定链接
2.5、-S 只建立组合语文件
2.6、-D 条件编译,搭配#ifdef #define用,如果有定义才编译
2.7、-c 表示只要求编译器进行编译,而不要进行链接,产生以原始文件的文件命名但把其后缀名由.c变成.o的目标文件
2.8、-g 要求编译器在编译的时候提供以后对程序进行调试的信息
2.9、-E 表示编译器只进行编译,而不做汇编和链接
2.10、-O1/O2/O3 比编译器对程序提供的最优化选项,在编译的时候使用该选项,可以使产生的可执行文件的执行效率提高,编译器会根据CPU的架构编出优化的程序代码,需要多花一点编译时间。-O2比较常用
2.11、-Wall 指定产出全部的警告信号
汇编器 arm-linux-as
汇编器用于将汇编源文件汇编成目标文件
连接器 arm-linux-ld
连接器用于连接目标文件和系统库中的函数代码(目标代码),示例用法如下
$arm-linux-ld test1.o test2.o -lc -o hello.elf hello.o 将test1.o、test2.o和hello.o一起连接生成可执行文件hello.elf文件
文件格式转换 arm-linux-objcopy
用于文件格式转换,将生成的hello.elf文件转换成二进制文件,示例用法如下:
$arm-linux-objcopy -O binary hello.elf hello.bin
反汇编 arm-linux-objdump
用于将目标文件或elf格式可执行文件反汇编成汇编代码文件,示例用法如下:
$arm-linux-objdump -S hello.o >hello.asm
elf格式文件查看:arm-linux-readelf
用来查看elf格式的文件的信息,可以输出elf文件额文件头信息,以及段信息,示例用法如下:
$arm-linux-readelf -a hello.elf
静态库管理 arm-linux-ar
静态库管理软件,可以将产生的目标文件“.O”文件生成或添加到库中,也可以查看库中有的目标文件,示例代码如下:
$arm-linux-ar rc hello.a hello.o
符号表生成指令 arm-linux-nm
生成elf文件中的符号,使用示例如下:
$arm-linux-nm hello.elf >sym
去掉elf文件中不需要的信息和代码 arm-linux-strip
用于去掉文件中不使用的一些信息,如调试信息等,以减小目标文件的体积。从而节省存储空间或提高加载、执行效率,使用示例如下:
$arm-linux-strip hello.elf
Makefile分析
心态崩了,用英文写的注释全都没了,分析完了以后,回头看还好,大体明白了Makefile工作流程,最主要的是递归编译
Makefile
1# Author : Aen
2# Date : 2021/8/16
3# Writing Makefile that mimics Linux kernel’s Makefile
4##########################################################
5# tools class
6CROSS_COMPILE = arm-linux-
7AS = $(CROSS_COMPILE)as
8LD = $(CROSS_COMPILE)ld
9CC = $(CROSS_COMPILE)gcc
10CPP = $(CC) -E
11AR = $(CROSS_COMPILE)ar
12NM = $(CROSS_COMPILE)nm
13
14STRIP = $(CROSS_COMPILE)strip
15OBJCOPY = $(CROSS_COMPILE)objcopy
16OBJDUMP = $(CROSS_COMPILE)objdump
17
18export AS LD CC CPP AR NM
19export STRIP OBJCOPY OBJDUMP
20
21
22CFLAGS := -Wall -Werror -O2 -g
23CFLAGS += -I $(shell pwd)/include
24
25LDFLAGS := -lm -lfreetype -lts -lpthread -ljpeg
26
27export CFLAGS LDFLAGS
28
29TOPDIR := $(shell pwd)
30export TOPDIR
31
32TARGET := show_file
33
34obj-y += main.o
35obj-y += show/
36obj-y += draw/
37obj-y += encoding/
38obj-y += fonts/
39obj-y += input/
40obj-y += debug/
41obj-y += render/
42obj-y += page/
43obj-y += file/
44
45all :
46 make -C ./ -f $(TOPDIR)/Makefile.build
47 $(CC) $(LDFLAGS) -o $(TARGET) built-in.o
48clean:
49 rm -f $(shell find -name "*.o")
50 rm -f $(TARGET)
51distclean:
52 rm -f $(shell find -name "*.o")
53 rm -f $(shell find -name "*.d")
54 rm -f $(TARGET)
Makefile.build
1PHONY := __build # 定义一个PHONY变量
2__build: #
3
4obj-y :=
5subdir-y :=
6
7include Makefile
8
9__subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y)))
10subdir-y += $(__subdir-y)
11
12subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o)
13
14cur_objs := $(filter-out %/, $(obj-y))
15dep_files := $(foreach f,$(cur_objs),.$(f).d)
16dep_files := $(wildcard $(dep_files))
17
18ifneq ($(dep_files),)
19 include $(dep_files)
20endif
21
22PHONY += $(subdir-y)
23
24__build : $(subdir-y) built-in.o
25
26$(subdir-y):
27 make -C $@ -f $(TOPDIR)/Makefile.build
28
29built-in.o : $(cur_objs) $(subdir_objs)
30 $(LD) -r -o $@ $^
31
32dep_file = .$@.d
33
34%.o : %.c
35 $(CC) $(CFLAGS) -Wp,-MD,$(dep_file) -c -o $@ $<
36
37.PHONY : $(PHONY)
这个文件主要还是了解学习了生成的流程,但是并没有深入了解Makefile中相关概念
end
艾恩凝
写于大连
2021/8/16
catalogue
[Linux]数码相框&电子书系列
- [Linux]数码相框&电子书(五)
- GNU ARM 命令行工具
- 编译器 arm-linux-gcc
- 1、编译步骤
- 1.1 预处理阶段
- 1.2 编译阶段
- 1.3 汇编阶段
- 1.4 链接阶段
- 2、arm-linux-gcc 常用命令行选项
- 汇编器 arm-linux-as
- 连接器 arm-linux-ld
- 文件格式转换 arm-linux-objcopy
- 反汇编 arm-linux-objdump
- elf格式文件查看:arm-linux-readelf
- 静态库管理 arm-linux-ar
- 符号表生成指令 arm-linux-nm
- 去掉elf文件中不需要的信息和代码 arm-linux-strip
- Makefile分析
- Makefile
- Makefile.build
- end
- catalogue
- [Linux]数码相框&电子书系列