较复杂makefile跟lds脚本程序的编写

首先看个makefile范例:

 1 /*指明工具链,并为其取个简单的别名*/
 2 CC      = arm-linux-gcc  
 3 LD      = arm-linux-ld
 4 AR      = arm-linux-ar
 5 OBJCOPY = arm-linux-objcopy
 6 OBJDUMP = arm-linux-objdump
 7 /*指明头文件的位置*/
 8 INCLUDEDIR     := $(shell pwd)/include
 9 /*-Wall 提示警告,-O2表示优化选项,最优优化,-fno-builtin表示自己来实现某些库函数,如果不加此选项会出现冲突*/
10 CFLAGS         := -Wall -O2 -fno-builtin
11 /*-nostdinc,-nostdlib 表示不使用这两个库,-I$(INCLUDEDIR)表示链接到头文件*/
12 CPPFLAGS       := -nostdinc -I$(INCLUDEDIR) -nostdlib
13 
14 /*使这些定义的变量生效*/
15 export     CC AR LD OBJCOPY OBJDUMP INCLUDEDIR CFLAGS CPPFLAGS 
16 
17 /**将.o文件和lib/目录下生成的.a静态库一起编译成.elf文件*/
18 objs := start.o main.o uart.o clock.o lcd.o lib/libc.a
19 
20 lcd70.bin: $(objs)
21     ${LD} -Tlcd70.lds -o lcd70.elf $^  //主要此处使用了Tlcd70.lds这个链接器脚本指明的代码的存放位置。
22     ${OBJCOPY} -O binary -S lcd70.elf $@
23     ${OBJDUMP} -D lcd70.elf > lcd70.dis
24 
25 /*指明伪目标,也就是没有依赖文件*/
26 .PHONY : lib/libc.a
27 /*进入目录中执行make命令生产.a静态库*/
28 lib/libc.a:
29     cd lib; make; cd ..
30     
31 %.o:%.c
32     ${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
33 
34 %.o:%.S
35     ${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
36 
37 clean:
38     make  clean -C lib
39     rm -f *.bin *.elf *.dis *.o

生产静态库的makefile:

objs := div64.o lib1funcs.o ctype.o muldi3.o printf.o string.o vsprintf.o

/*生产静态库*/
libc.a: $(objs)
    ${AR} -r -o $@ $^
/*将.c和.S文件生成.o文件*/
%.o:%.c
    ${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

%.o:%.S
    ${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

clean:
    rm -f libc.a *.o    

链接器脚本:

SECTIONS
{
    . = 0x40000000;  //指明了程序的开始运行地址
    .text : {
        start.o//指明第一个要运行的文件
        * (.text)
    }
    .data : {
        * (.data)
    }
    .bss : {
        * (.bss)
    }    
}

  

原文地址:https://www.cnblogs.com/defen/p/5400492.html