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