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