[Linux]数码相框&电子书(五)Makefile分析

image.png

[Linux]数码相框&电子书(五)

个人博客https://aeneag.xyz/

艾恩凝

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]数码相框&电子书系列

    评论
    0 评论
avatar

取消