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 信息。