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