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 := init myprog1 myprog2 myprog3 myprog4 !! 030 PROGS := myprog1 myprog2 myprog3 myprog4 myprog5 myprog6
031 myprog7 myprog8 myprog9 myprog10 mypr <<
032 myprog13 myprog14 banner <<
033 031
034 # Build dependencies of the programs 032 # Build dependencies of the programs
035 $(PROGS) : % : %.o crt.o libc.a 033 $(PROGS) : % : %.o crt.o libc.a
036 034
037 PWD := $(shell pwd) 035 PWD := $(shell pwd)
038 036
039 037
040 $(PROGS): 038 $(PROGS):
041 $(CC) -static $(LDFLAGS) -o $@ $^ $(LI 039 $(CC) -static $(LDFLAGS) -o $@ $^ $(LIBGCC)
042 040
043 041
044 libc.a: libc.o string.o stdarg.o debug.o 042 libc.a: libc.o string.o stdarg.o debug.o
045 043
046 044
047 userprogs.kimg: $(PROGS) 045 userprogs.kimg: $(PROGS)
048 @echo "# Generating ELF images for inc 046 @echo "# Generating ELF images for inclusion into the kernel image: $@"
049 @echo "SECTIONS { .userprogs . : { " > 047 @echo "SECTIONS { .userprogs . : { " > .userprogs.lds
050 @i=0 ; 048 @i=0 ; \
051 for f in $^ ; do 049 for f in $^ ; do \
052 i=`expr $$i + 1` ; 050 i=`expr $$i + 1` ; \
053 echo "extern char _begin_userprog$$ 051 echo "extern char _begin_userprog$$i, _end_userprog$$i;" \
054 > .userprog$$i.c ; 052 > .userprog$$i.c ; \
055 echo "char *_userprog"$$i"_entry[]" 053 echo "char *_userprog"$$i"_entry[]" >> .userprog$$i.c ; \
056 echo " __attribute__((section(\".u 054 echo " __attribute__((section(\".userprogs_table\")))" \
057 >> .userprog$$i.c ; 055 >> .userprog$$i.c ; \
058 echo " = { \"$$f\", &_begin_userpr 056 echo " = { \"$$f\", &_begin_userprog$$i, &_end_userprog$$i };" \
059 >> .userprog$$i.c ; 057 >> .userprog$$i.c ; \
060 $(CC) $(CFLAGS) -c .userprog$$i.c - 058 $(CC) $(CFLAGS) -c .userprog$$i.c -o .userprog$$i.o ; \
061 $(OBJCOPY) --add-section .userprog$ 059 $(OBJCOPY) --add-section .userprog$$i=$$f .userprog$$i.o \
062 .userprog$$i.kimg ; 060 .userprog$$i.kimg ; \
063 echo " . = ALIGN(4096);" >> .userp 061 echo " . = ALIGN(4096);" >> .userprogs.lds ; \
064 echo " _begin_userprog$$i = .;" >> 062 echo " _begin_userprog$$i = .;" >> .userprogs.lds ; \
065 echo " .userprog$$i.kimg(.userprog 063 echo " .userprog$$i.kimg(.userprog$$i);" >> .userprogs.lds ; \
066 echo " _end_userprog$$i = .;" >> . 064 echo " _end_userprog$$i = .;" >> .userprogs.lds ; \
067 echo " .userprog$$i.kimg(.rodata); 065 echo " .userprog$$i.kimg(.rodata); .userprog$$i.kimg(.data);" \
068 >> .userprogs.lds ; 066 >> .userprogs.lds ; \
069 done 067 done
070 @echo " _userprogs_table = .; *(.user 068 @echo " _userprogs_table = .; *(.userprogs_table) ; LONG(0);" \
071 >> .userprogs.lds 069 >> .userprogs.lds
072 @echo "} /DISCARD/ : { *(.text) *(.dat 070 @echo "} /DISCARD/ : { *(.text) *(.data) *(.bss) } }" \
073 >> .userprogs.lds 071 >> .userprogs.lds
074 @$(LD) -r -o $@ -T.userprogs.lds 072 @$(LD) -r -o $@ -T.userprogs.lds
075 073
076 074
077 %.a: 075 %.a:
078 $(AR) rcv $@ $^ 076 $(AR) rcv $@ $^
079 077
080 078
081 %.o: %.c 079 %.o: %.c
082 $(CC) -I$(PWD) -c $< $(CFLAGS) -o $@ 080 $(CC) -I$(PWD) -c $< $(CFLAGS) -o $@
083 081
084 082
085 %.o: %.S 083 %.o: %.S
086 $(CC) -I$(PWD) -c $< $(CFLAGS) -DASM_S 084 $(CC) -I$(PWD) -c $< $(CFLAGS) -DASM_SOURCE=1 -o $@
087 085
088 086
089 clean: 087 clean:
090 $(RM) *.o *.a *~ $(PROGS) *.kimg 088 $(RM) *.o *.a *~ $(PROGS) *.kimg
091 $(RM) .userprog* 089 $(RM) .userprog*