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