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