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