diff --git a/.gitignore b/.gitignore index b3f5a0015..2207e82fd 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ include/syscall-codes.h protobuf/*.c protobuf/*.h include/version.h +arch/x86/sys-exec-tbl.c +arch/x86/syscalls.S diff --git a/Makefile b/Makefile index 1c90a0707..4f34faf29 100644 --- a/Makefile +++ b/Makefile @@ -81,13 +81,18 @@ else endif CFLAGS += $(WARNINGS) $(DEFINES) -SYSCALL-LIB = $(SRC_DIR)/arch/$(ARCH)/syscalls.o PROTOBUF-LIB = $(SRC_DIR)/protobuf/protobuf-lib.o +SYSCALL-LIB := arch/$(ARCH)/syscalls.built-in.o +ARCH-LIB := arch/$(ARCH)/crtools.built-in.o export E Q CC ECHO MAKE CFLAGS LIBS ARCH DEFINES MAKEFLAGS -export SRC_DIR SYSCALL-LIB SH ARCH_DIR OBJCOPY LDARCH +export SRC_DIR SYSCALL-LIB SH RM ARCH_DIR OBJCOPY LDARCH LD include scripts/Makefile.version +include scripts/Makefile.rules +# +# shorthand +build := -s -r -R --no-print-directory -f scripts/Makefile.build makefile=Makefile obj PROGRAM := crtools @@ -135,12 +140,11 @@ OBJS += tty.o OBJS += cr-exec.o OBJS += cpu.o OBJS += file-lock.o -OBJS += $(ARCH_DIR)/crtools.o DEPS := $(patsubst %.o,%.d,$(OBJS)) .PHONY: all zdtm test rebuild clean distclean tags cscope \ - docs help pie protobuf $(ARCH) + docs help pie protobuf arch/$(ARCH) ifeq ($(GCOV),1) %.o $(PROGRAM): override CFLAGS += --coverage @@ -149,15 +153,17 @@ endif all: pie $(VERSION_HEADER) $(Q) $(MAKE) $(PROGRAM) -pie: protobuf $(ARCH) +arch/$(ARCH)/%:: protobuf + $(Q) $(MAKE) $(build)=arch/$(ARCH) $@ +arch/$(ARCH): protobuf + $(Q) $(MAKE) $(build)=arch/$(ARCH) all + +pie: arch/$(ARCH) protobuf $(Q) $(MAKE) -C pie/ protobuf: $(Q) $(MAKE) -C protobuf/ -$(ARCH): - $(Q) $(MAKE) -C arch/$(ARCH)/ - %.o: %.c $(E) " CC " $@ $(Q) $(CC) -c $(CFLAGS) $< -o $@ @@ -174,7 +180,7 @@ $(ARCH): $(E) " DEP " $@ $(Q) $(CC) -M -MT $@ -MT $(patsubst %.d,%.o,$@) $(CFLAGS) $< -o $@ -$(PROGRAM): $(OBJS) $(SYSCALL-LIB) $(PROTOBUF-LIB) +$(PROGRAM): $(OBJS) $(SYSCALL-LIB) $(ARCH-LIB) $(PROTOBUF-LIB) $(E) " LINK " $@ $(Q) $(CC) $(CFLAGS) $^ $(LIBS) -o $@ @@ -195,6 +201,7 @@ rebuild: clean: $(E) " CLEAN" $(Q) $(RM) $(VERSION_HEADER) + $(Q) $(MAKE) $(build)=arch/$(ARCH) clean $(Q) $(RM) ./*.o $(Q) $(RM) ./*.d $(Q) $(RM) ./*.i @@ -208,7 +215,6 @@ clean: $(Q) $(RM) -r ./test/lib/ $(Q) $(RM) -r ./test/lib64/ $(Q) $(MAKE) -C protobuf/ clean - $(Q) $(MAKE) -C arch/$(ARCH)/ clean $(Q) $(MAKE) -C pie/ clean $(Q) $(MAKE) -C test/zdtm cleandep $(Q) $(MAKE) -C test/zdtm clean diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 847e1061e..588ff0029 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -1,57 +1,57 @@ -SYS-DEF := $(ARCH_DIR)/syscall.def -SYS-ASM-COMMON := syscall-common.S -SYS-TYPES := $(SRC_DIR)/include/syscall-types.h - -SYS-CODES := $(SRC_DIR)/include/syscall-codes.h -SYS-PROTO := $(SRC_DIR)/include/syscall.h +targets += syscalls +targets += crtools SYS-ASM := syscalls.S -SYS-GEN := $(ARCH_DIR)/gen-syscalls.pl -SYS-GEN-TBL := $(ARCH_DIR)/gen-sys-exec-tbl.pl -SYS-OBJ := syscalls.o +syscalls-asm-y += $(SYS-ASM:.S=).o +crtools-obj-y += crtools.o + +SYS-DEF := syscall.def +SYS-ASM-COMMON := syscall-common.S +SYS-TYPES := include/syscall-types.h + +SYS-CODES := include/syscall-codes.h +SYS-PROTO := include/syscall.h + +SYS-GEN := gen-syscalls.pl +SYS-GEN-TBL := gen-sys-exec-tbl.pl SYS-EXEC-TBL := sys-exec-tbl.c -CFLAGS += -c -fpie -Wstrict-prototypes -Wa,--noexecstack -D__ASSEMBLY__ -nostdlib -fomit-frame-pointer -I$(shell pwd) +CFLAGS += -fpie -Wstrict-prototypes -Wa,--noexecstack +CFLAGS += -nostdlib -fomit-frame-pointer -I$(obj) +ASMFLAGS += -D__ASSEMBLY__ ARCH_BITS := 32 -.DEFAULT_GOAL := arm - -$(SYS-ASM): $(SYS-GEN) $(SYS-DEF) $(SYS-ASM-COMMON) $(SYS-TYPES) +$(obj)/$(SYS-ASM): $(obj)/$(SYS-GEN) $(obj)/$(SYS-DEF) $(obj)/$(SYS-ASM-COMMON) $(SYS-TYPES) $(E) " GEN " $@ $(Q) perl \ - $(SYS-GEN) \ - $(SYS-DEF) \ + $(obj)/$(SYS-GEN) \ + $(obj)/$(SYS-DEF) \ $(SYS-CODES) \ $(SYS-PROTO) \ - $(SYS-ASM) \ + $(obj)/$(SYS-ASM) \ $(SYS-ASM-COMMON) \ $(SYS-TYPES) \ $(ARCH_BITS) +$(obj)/syscalls.o: $(obj)/$(SYS-ASM) + $(SYS-EXEC-TBL): $(SYS-GEN-TBL) $(SYS-DEF) $(E) " GEN " $@ $(Q) perl \ - $(SYS-GEN-TBL) \ - $(SYS-DEF) \ - $(SYS-EXEC-TBL) \ + $(obj)/$(SYS-GEN-TBL) \ + $(obj)/$(SYS-DEF) \ + $(obj)/$(SYS-EXEC-TBL) \ $(ARCH_BITS) -%.o: %.S - $(E) " CC " $@ - $(Q) $(CC) $(CFLAGS) $^ -o $@ +_all += $(obj)/$(SYS-EXEC-TBL) -arm: $(SYS-OBJ) $(SYS-EXEC-TBL) +cleanup-y += $(obj)/$(SYS-EXEC-TBL) $(obj)/$(SYS-ASM) +cleanup-y += $(SYS-CODES) +cleanup-y += $(SYS-PROTO) -clean: - $(E) " CLEAN SYSCALLS" - $(Q) $(RM) -f $(SYS-ASM) - $(Q) $(RM) -f $(SYS-CODES) - $(Q) $(RM) -f $(SYS-PROTO) - $(Q) $(RM) -f $(SYS-OBJ) - $(Q) $(RM) -f $(SYS-EXEC-TBL) - $(Q) $(RM) -f *.o *.d - -.PHONY: clean arm +ifneq ($(MAKECMDGOALS),clean) +incdeps := y +endif diff --git a/arch/x86/Makefile b/arch/x86/Makefile index 3e8df6047..6b7b6125a 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile @@ -1,52 +1,52 @@ -SYS-DEF := $(ARCH_DIR)/syscall-x86-64.def -SYS-ASM-COMMON := syscall-common-x86-64.S -SYS-TYPES := $(SRC_DIR)/include/syscall-types.h - -SYS-CODES := $(SRC_DIR)/include/syscall-codes.h -SYS-PROTO := $(SRC_DIR)/include/syscall.h +targets += syscalls +targets += crtools SYS-ASM := syscalls.S -SYS-GEN := syscalls-x86-64.sh -SYS-OBJ := syscalls.o +syscalls-asm-y += $(SYS-ASM:.S=).o +crtools-obj-y += crtools.o + +SYS-DEF := syscall-x86-64.def +SYS-ASM-COMMON := syscall-common-x86-64.S + +SYS-TYPES := include/syscall-types.h +SYS-CODES := include/syscall-codes.h +SYS-PROTO := include/syscall.h + +SYS-GEN := syscalls-x86-64.sh SYS-EXEC-TBL := sys-exec-tbl.c -CFLAGS += -c -fpie -Wstrict-prototypes -Wa,--noexecstack -D__ASSEMBLY__ -nostdlib -fomit-frame-pointer -I$(shell pwd) +CFLAGS += -fpie -Wstrict-prototypes -Wa,--noexecstack +CFLAGS += -nostdlib -fomit-frame-pointer -I$(obj) +ASMFLAGS += -D__ASSEMBLY__ -.DEFAULT_GOAL := x86 - -$(SYS-ASM): $(SYS-GEN) $(SYS-DEF) $(SYS-ASM-COMMON) $(SYS-TYPES) +$(obj)/$(SYS-ASM): $(obj)/$(SYS-GEN) $(obj)/$(SYS-DEF) $(obj)/$(SYS-ASM-COMMON) $(SYS-TYPES) $(E) " GEN " $@ - $(Q) $(SH) \ - $(SYS-GEN) --asm \ - $(SYS-DEF) \ - $(SYS-CODES) \ - $(SYS-PROTO) \ - $(SYS-ASM) \ - $(SYS-ASM-COMMON) \ + $(Q) $(SH) \ + $(obj)/$(SYS-GEN) --asm \ + $(obj)/$(SYS-DEF) \ + $(SYS-CODES) \ + $(SYS-PROTO) \ + $(obj)/$(SYS-ASM) \ + $(SYS-ASM-COMMON) \ $(SYS-TYPES) -$(SYS-EXEC-TBL): $(SYS-GEN) $(SYS-DEF) +$(obj)/syscalls.o: $(obj)/$(SYS-ASM) + +$(obj)/$(SYS-EXEC-TBL): $(obj)/$(SYS-GEN) $(obj)/$(SYS-DEF) $(E) " GEN " $@ - $(Q) $(SH) \ - $(SYS-GEN) --exec \ - $(SYS-DEF) \ - $(SYS-EXEC-TBL) + $(Q) $(SH) \ + $(obj)/$(SYS-GEN) --exec \ + $(obj)/$(SYS-DEF) \ + $(obj)/$(SYS-EXEC-TBL) -%.o: %.S - $(E) " CC " $@ - $(Q) $(CC) $(CFLAGS) $^ -o $@ +_all += $(obj)/$(SYS-EXEC-TBL) -x86: $(SYS-OBJ) $(SYS-EXEC-TBL) +cleanup-y += $(obj)/$(SYS-EXEC-TBL) $(obj)/$(SYS-ASM) +cleanup-y += $(SYS-CODES) +cleanup-y += $(SYS-PROTO) -clean: - $(E) " CLEAN SYSCALLS" - $(Q) $(RM) -f $(SYS-ASM) - $(Q) $(RM) -f $(SYS-CODES) - $(Q) $(RM) -f $(SYS-PROTO) - $(Q) $(RM) -f $(SYS-OBJ) - $(Q) $(RM) -f $(SYS-EXEC-TBL) - $(Q) $(RM) -f *.o *.d - -.PHONY: clean x86 +ifneq ($(MAKECMDGOALS),clean) +incdeps := y +endif diff --git a/arch/x86/syscalls-x86-64.sh b/arch/x86/syscalls-x86-64.sh index 8aafc38d0..22c81293d 100644 --- a/arch/x86/syscalls-x86-64.sh +++ b/arch/x86/syscalls-x86-64.sh @@ -3,13 +3,14 @@ gen_asm() { in=$1 codesout=$2 + codesinc=`echo $2 | sed -e 's/.*include\///g'` protosout=$3 asmout=$4 - asmcommon=$5 + asmcommon=`echo $5 | sed -e 's/.*include\///g'` prototypes=`echo $6 | sed -e 's/.*include\///g'` - codesdef=`echo $codesout | sed -e 's/.*\/include\///g' | tr "[[:space:]].-" _` - protosdef=`echo $protosout | sed -e 's/.*\/include\///g' | tr "[[:space:]].-" _` + codesdef=`echo $codesout | sed -e 's/.*include\///g' | tr "[[:space:]].-" _` + protosdef=`echo $protosout | sed -e 's/.*include\///g' | tr "[[:space:]].-" _` echo "/* Autogenerated, don't edit */" > $codesout echo "#ifndef $codesdef" >> $codesout @@ -19,10 +20,10 @@ gen_asm() { echo "#ifndef $protosdef" >> $protosout echo "#define $protosdef" >> $protosout echo "#include \"$prototypes\"" >> $protosout - echo "#include \"$codesout\"" >> $protosout + echo "#include \"$codesinc\"" >> $protosout echo "/* Autogenerated, don't edit */" > $asmout - echo "#include \"$codesout\"" >> $asmout + echo "#include \"$codesinc\"" >> $asmout echo "#include \"$asmcommon\"" >> $asmout cat $in | egrep -v '^#' | sed -e 's/\t\{1,\}/|/g' | awk -F '|' '{print "#define", $1, $2}' >> $codesout diff --git a/pie/Makefile b/pie/Makefile index 5c691d577..f4271e266 100644 --- a/pie/Makefile +++ b/pie/Makefile @@ -16,7 +16,6 @@ ASMFLAGS := -D__ASSEMBLY__ LIB-OBJS := log-simple.o blob-util-net.o DEPS := $(RESTORER-ARCH-OBJS:.o=.d) $(LIB-OBJS:.o=.d) -LIB-OBJS += $(SYSCALL-LIB) $(PARASITE): $(LIB-OBJS) $(PASM-OBJS) $(PIELDS) $(RESTORER): $(LIB-OBJS) $(RESTORER-ARCH-OBJS) $(PIELDS) @@ -45,7 +44,7 @@ blob-util-net.o: $(SRC_DIR)/util-net.c %.bin.o: %.o $(E) " GEN " $@ - $(Q) $(LD) -T $(PIELDS) -o $@ $(^:$(PIELDS)=) + $(Q) $(LD) -T $(PIELDS) -o $@ $(^:$(PIELDS)=) ../$(SYSCALL-LIB) %.bin: %.bin.o $(E) " GEN " $@