Diff markup
001 001
002 002
003 003
004 004
005 005
006 006
007 007
008 008
009 009
010 010
011 011
012 012
013 013
014 014
015 015
016 016
017 017
018 CC=gcc 018 CC=gcc
019 AR=ar 019 AR=ar
020 OBJCOPY=objcopy 020 OBJCOPY=objcopy
021 CFLAGS = -Wall -nostdinc -ffreestanding -I. - 021 CFLAGS = -Wall -nostdinc -ffreestanding -I. -I..
022 LIBGCC := $(shell $(CC) -print-libgcc-file-nam 022 LIBGCC := $(shell $(CC) -print-libgcc-file-name)
023 LDFLAGS = -Wl,--warn-common -nostdlib -Wl,-Tld 023 LDFLAGS = -Wl,--warn-common -nostdlib -Wl,-Tldscript.lds
024 024
025 025
026 all: userprogs.kimg 026 all: userprogs.kimg
027 027
028 -include .mkvars 028 -include .mkvars
029 029
030 PROGS := myprog1 myprog2 myprog3 myprog4 mypro !! 030 PROGS := init myprog1 myprog2 myprog3 myprog4 myprog5 myprog6 \
>> 031 myprog7 myprog8 myprog9 myprog10 myprog11 myprog12 \
>> 032 myprog13 myprog14 banner
031 033
032 # Build dependencies of the programs 034 # Build dependencies of the programs
033 $(PROGS) : % : %.o crt.o libc.a 035 $(PROGS) : % : %.o crt.o libc.a
034 036
035 PWD := $(shell pwd) 037 PWD := $(shell pwd)
036 038
037 039
038 $(PROGS): 040 $(PROGS):
039 $(CC) -static $(LDFLAGS) -o $@ $^ $(LI 041 $(CC) -static $(LDFLAGS) -o $@ $^ $(LIBGCC)
040 042
041 043
042 libc.a: libc.o string.o stdarg.o debug.o 044 libc.a: libc.o string.o stdarg.o debug.o
043 045
044 046
045 userprogs.kimg: $(PROGS) 047 userprogs.kimg: $(PROGS)
046 @echo "# Generating ELF images for inc 048 @echo "# Generating ELF images for inclusion into the kernel image: $@"
047 @echo "SECTIONS { .userprogs . : { " > 049 @echo "SECTIONS { .userprogs . : { " > .userprogs.lds
048 @i=0 ; 050 @i=0 ; \
049 for f in $^ ; do 051 for f in $^ ; do \
050 i=`expr $$i + 1` ; 052 i=`expr $$i + 1` ; \
051 echo "extern char _begin_userprog$$ 053 echo "extern char _begin_userprog$$i, _end_userprog$$i;" \
052 > .userprog$$i.c ; 054 > .userprog$$i.c ; \
053 echo "char *_userprog"$$i"_entry[]" 055 echo "char *_userprog"$$i"_entry[]" >> .userprog$$i.c ; \
054 echo " __attribute__((section(\".u 056 echo " __attribute__((section(\".userprogs_table\")))" \
055 >> .userprog$$i.c ; 057 >> .userprog$$i.c ; \
056 echo " = { \"$$f\", &_begin_userpr 058 echo " = { \"$$f\", &_begin_userprog$$i, &_end_userprog$$i };" \
057 >> .userprog$$i.c ; 059 >> .userprog$$i.c ; \
058 $(CC) $(CFLAGS) -c .userprog$$i.c - 060 $(CC) $(CFLAGS) -c .userprog$$i.c -o .userprog$$i.o ; \
059 $(OBJCOPY) --add-section .userprog$ 061 $(OBJCOPY) --add-section .userprog$$i=$$f .userprog$$i.o \
060 .userprog$$i.kimg ; 062 .userprog$$i.kimg ; \
061 echo " . = ALIGN(4096);" >> .userp 063 echo " . = ALIGN(4096);" >> .userprogs.lds ; \
062 echo " _begin_userprog$$i = .;" >> 064 echo " _begin_userprog$$i = .;" >> .userprogs.lds ; \
063 echo " .userprog$$i.kimg(.userprog 065 echo " .userprog$$i.kimg(.userprog$$i);" >> .userprogs.lds ; \
064 echo " _end_userprog$$i = .;" >> . 066 echo " _end_userprog$$i = .;" >> .userprogs.lds ; \
065 echo " .userprog$$i.kimg(.rodata); 067 echo " .userprog$$i.kimg(.rodata); .userprog$$i.kimg(.data);" \
066 >> .userprogs.lds ; 068 >> .userprogs.lds ; \
067 done 069 done
068 @echo " _userprogs_table = .; *(.user 070 @echo " _userprogs_table = .; *(.userprogs_table) ; LONG(0);" \
069 >> .userprogs.lds 071 >> .userprogs.lds
070 @echo "} /DISCARD/ : { *(.text) *(.dat 072 @echo "} /DISCARD/ : { *(.text) *(.data) *(.bss) } }" \
071 >> .userprogs.lds 073 >> .userprogs.lds
072 @$(LD) -r -o $@ -T.userprogs.lds 074 @$(LD) -r -o $@ -T.userprogs.lds
073 075
074 076
075 %.a: 077 %.a:
076 $(AR) rcv $@ $^ 078 $(AR) rcv $@ $^
077 079
078 080
079 %.o: %.c 081 %.o: %.c
080 $(CC) -I$(PWD) -c $< $(CFLAGS) -o $@ 082 $(CC) -I$(PWD) -c $< $(CFLAGS) -o $@
081 083
082 084
083 %.o: %.S 085 %.o: %.S
084 $(CC) -I$(PWD) -c $< $(CFLAGS) -DASM_S 086 $(CC) -I$(PWD) -c $< $(CFLAGS) -DASM_SOURCE=1 -o $@
085 087
086 088
087 clean: 089 clean:
088 $(RM) *.o *.a *~ $(PROGS) *.kimg 090 $(RM) *.o *.a *~ $(PROGS) *.kimg
089 $(RM) .userprog* 091 $(RM) .userprog*