Makefile进阶篇之LD

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

关于ld的解释可以参考另外两篇文章: 简单的ld描述 ELF文件结构描述

Back to top: