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