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