Makefile进阶篇
概述
上一张Makefile之初级篇 描述了如何编写一个简单的Makefile。如上一篇所说,生成可执行文件包含了两个过程: 编译 + 连接。
- 如果没有特别指定需要使用的ld文件,连接阶段就会使用gcc 的默认ld文件;
- 如果需要使用特别的ld 文件,可以使用如下命令:
arm-linux-ld -Tlink.lds sample1.o sample2.o main.o -o hello.elf
arm-linux-objcopy -O binary hello.elf hello
```
## ld 使用方法
这里继续使用上一篇文章的例子。
```c
cc = gcc
prom = hello
DIR= ($shell pwd)
inc_dir = $(DIR)/inc
src_dir = $(DIR)/src
obj = $(pathsubst $(src_dir)/%.c, $(src_dir)/%.o, $(wildcard $(src_dir)/%.c) )
$(prom): $(obj)
$(cc) -o $(prom) $(obj)
%.o: %.c $(deps)
$(cc) -I$(inc_dir) -c $< -o $@
.PHONY : clean
clean:
rm -rf $(obj) $(prom)
如果我们想使用我们自己指定的ld 文件,该如何操作呢?
prom = hello
DIR= ($shell pwd)
inc_dir = $(DIR)/inc
src_dir = $(DIR)/src
obj = $(pathsubst $(src_dir)/%.c, $(src_dir)/%.o, $(wildcard $(src_dir)/%.c) )
output = $(DIR)/out
LINK_DIR = $(DIR)/toolchain/bin/arm-none-eabi-
LINK_LD = $(LINK_DIR)/ld
LINK_OBJCOPY = $(LINK_DIR)/objcopy
LINK_LDFILE = $(DIR)/link.ld
cc = $(LINK_DIR)/gcc
all: clean $(output) $(obj_dir) $(prom)
$(output):
mkdir $@
$(obj_dir):
mkdir $@
$(prom): $(obj)
$(LINK_LD) -T$(LINK_LDFILE ) $(obj) -o hello.elf
$(LINK_OBJCOPY ) -O binary -S hello.elf hello.bin
$(obj_dir)/%.o: $(src_dir)/%.c
$(cc) -I$(inc_dir) -c $< -o $@
.PHONY : clean
clean:
rm -rf $(obj)
rm -rf %(output)/*
对上述的hello.elf 做一下简单的说明:
hello.elf: 用来描述hello.bin 文件的section 和 segment 信息。