Makefile进阶篇之LD

Makefile进阶篇

概述

上一张Makefile之初级篇 描述了如何编写一个简单的Makefile。如上一篇所说,生成可执行文件包含了两个过程: 编译 + 连接。

  1. 如果没有特别指定需要使用的ld文件,连接阶段就会使用gcc 的默认ld文件;
  2. 如果需要使用特别的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文件结构描述

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值