您的位置:首页 > 其它

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

2016-04-17 10:52 176 查看
首先看个makefile范例:

/*指明工具链,并为其取个简单的别名*/
CC      = arm-linux-gcc
LD      = arm-linux-ld
AR      = arm-linux-ar
OBJCOPY = arm-linux-objcopy
OBJDUMP = arm-linux-objdump
/*指明头文件的位置*/
INCLUDEDIR     := $(shell pwd)/include
/*-Wall 提示警告,-O2表示优化选项,最优优化,-fno-builtin表示自己来实现某些库函数,如果不加此选项会出现冲突*/
CFLAGS         := -Wall -O2 -fno-builtin
/*-nostdinc,-nostdlib 表示不使用这两个库,-I$(INCLUDEDIR)表示链接到头文件*/
CPPFLAGS       := -nostdinc -I$(INCLUDEDIR) -nostdlib

/*使这些定义的变量生效*/
export     CC AR LD OBJCOPY OBJDUMP INCLUDEDIR CFLAGS CPPFLAGS

/**将.o文件和lib/目录下生成的.a静态库一起编译成.elf文件*/
objs := start.o main.o uart.o clock.o lcd.o lib/libc.a

lcd70.bin: $(objs)
${LD} -Tlcd70.lds -o lcd70.elf $^  //主要此处使用了Tlcd70.lds这个链接器脚本指明的代码的存放位置。
${OBJCOPY} -O binary -S lcd70.elf $@
${OBJDUMP} -D lcd70.elf > lcd70.dis

/*指明伪目标,也就是没有依赖文件*/
.PHONY : lib/libc.a
/*进入目录中执行make命令生产.a静态库*/
lib/libc.a:
cd lib; make; cd ..

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

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

clean:
make  clean -C lib
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)
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: