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文件結構描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章