aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2005-04-10 00:54:12 +0000
committerH. Peter Anvin <hpa@zytor.com>2005-04-10 00:54:12 +0000
commita617cc20accc4a3f6725b710ad95904d9d6843be (patch)
tree4158eabab7763d4f78e72b975aa230256dc27d64
parentc5138ca59b8196cb57ed840a8d6ac72c4aa95c36 (diff)
downloadklibc-a617cc20accc4a3f6725b710ad95904d9d6843be.tar.gz
More changes for the benefit of kbuild.klibc-1.0.7
-rw-r--r--cp-to-kernel.sh42
-rw-r--r--kernel/Kbuild72
-rw-r--r--kernel/Kbuild.include52
-rw-r--r--kernel/Kbuild.klibc281
-rw-r--r--klibc/Kbuild149
-rw-r--r--klibc/Makefile12
-rw-r--r--klibc/socketcalls.pl4
-rw-r--r--klibc/syscalls.pl2
8 files changed, 605 insertions, 9 deletions
diff --git a/cp-to-kernel.sh b/cp-to-kernel.sh
new file mode 100644
index 0000000000000..bc9f91548019c
--- /dev/null
+++ b/cp-to-kernel.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+# Copy klibc to kernel - integrating klibc with the kbuild infrastructure
+# Most files are located in the usr/ directory structure in the kernel
+
+# fetch kernel directory
+if [ -z $1 ]; then
+ echo "Copy klibc to kernel"
+ echo "$0: path-to-kernel-src"
+ exit 1
+fi
+
+kernel=$1
+if [ ! -d $kernel ]; then
+ echo "$kernel is not a kernel directory"
+ exit 1
+fi
+
+if [ -z $2 ]; then
+ echo "Copying source files"
+ # 1) Copy all klibc source files
+ if [ ! -d $kernel/usr/klibc ]; then
+ mkdir $kernel/usr/klibc
+ fi
+ cp -R klibc/* $kernel/usr/klibc
+
+ echo "Copying header files"
+ # 2) And the include files
+ if [ ! -d $kernel/usr/include ]; then
+ mkdir $kernel/usr/include
+ fi
+ cp -R include/* $kernel/usr/include
+fi
+
+echo "Copying kbuild files"
+cp kernel/Kbuild.* $kernel/scripts
+cp kernel/Kbuild $kernel/usr
+cp klibc/Kbuild $kernel/usr/klibc
+cp klibc/syscalls/Kbuild $kernel/usr/klibc/syscalls
+cp klibc/socketcalls/Kbuild $kernel/usr/klibc/socketcalls
+
+
diff --git a/kernel/Kbuild b/kernel/Kbuild
new file mode 100644
index 0000000000000..9df200a7b915a
--- /dev/null
+++ b/kernel/Kbuild
@@ -0,0 +1,72 @@
+#
+# kbuild file for usr/ - including initramfs image and klibc
+#
+
+obj-y := initramfs_data.o
+always := klibc/libc.a
+hostprogs-y := gen_init_cpio
+clean-files := initramfs_data.cpio.gz initramfs_list
+
+# Build klibc library
+$(obj)/klibc/libc.a: FORCE
+ $(Q)$(MAKE) -rR -f $(srctree)/scripts/Kbuild.klibc obj=$(obj)/klibc
+
+# initramfs_data.o contains the initramfs_data.cpio.gz image.
+# The image is included using .incbin, a dependency which is not
+# tracked automatically.
+$(obj)/initramfs_data.o: $(obj)/initramfs_data.cpio.gz FORCE
+
+ifdef CONFIG_INITRAMFS_ROOT_UID
+gen_initramfs_args += -u $(CONFIG_INITRAMFS_ROOT_UID)
+endif
+
+ifdef CONFIG_INITRAMFS_ROOT_GID
+gen_initramfs_args += -g $(CONFIG_INITRAMFS_ROOT_GID)
+endif
+
+# The $(shell echo $(CONFIG_INITRAMFS_SOURCE)) is to remove the
+# gratuitous begin and end quotes from the Kconfig string type.
+# Internal, escaped quotes in the Kconfig string will loose the
+# escape and become active quotes.
+quotefixed_initramfs_source := $(shell echo $(CONFIG_INITRAMFS_SOURCE))
+
+filechk_initramfs_list = $(CONFIG_SHELL) \
+ $(srctree)/scripts/gen_initramfs_list.sh $(gen_initramfs_args) \
+ $(quotefixed_initramfs_source)
+
+$(obj)/initramfs_list: FORCE
+ $(call filechk,initramfs_list)
+
+quiet_cmd_cpio = CPIO $@
+ cmd_cpio = ./$< $(obj)/initramfs_list > $@
+
+
+# Check if the INITRAMFS_SOURCE is a cpio archive
+ifneq (,$(findstring .cpio,$(quotefixed_initramfs_source)))
+
+# INITRAMFS_SOURCE has a cpio archive - verify that it's a single file
+ifneq (1,$(words $(quotefixed_initramfs_source)))
+$(error Only a single file may be specified in CONFIG_INITRAMFS_SOURCE (="$(quotefixed_initramfs_source)") when a cpio archive is directly specified.)
+endif
+# Now use the cpio archive directly
+initramfs_data_cpio = $(quotefixed_initramfs_source)
+targets += $(quotefixed_initramfs_source)
+
+else
+
+# INITRAMFS_SOURCE is not a cpio archive - create one
+$(obj)/initramfs_data.cpio: $(obj)/gen_init_cpio \
+ $(initramfs-y) $(obj)/initramfs_list FORCE
+ $(call if_changed,cpio)
+
+targets += initramfs_data.cpio
+initramfs_data_cpio = $(obj)/initramfs_data.cpio
+
+endif
+
+
+$(obj)/initramfs_data.cpio.gz: $(initramfs_data_cpio) FORCE
+ $(call if_changed,gzip)
+
+targets += initramfs_data.cpio.gz
+
diff --git a/kernel/Kbuild.include b/kernel/Kbuild.include
new file mode 100644
index 0000000000000..e9179471b97d6
--- /dev/null
+++ b/kernel/Kbuild.include
@@ -0,0 +1,52 @@
+#
+# Generic kbuild routines
+#
+
+# The temporary file to save gcc -MD generated dependencies must not
+# contain a comma
+depfile = $(subst $(comma),_,$(@D)/.$(@F).d)
+
+
+ifneq ($(KBUILD_NOCMDDEP),1)
+# Check if both arguments has same arguments. Result in empty string if equal
+# User may override this check using make KBUILD_NOCMDDEP=1
+arg-check = $(strip $(filter-out $(1), $(2)) $(filter-out $(2), $(1)) )
+
+endif
+
+# If quiet is set, only print short version of command
+cmd = @$(if $($(quiet)cmd_$(1)),\
+ echo ' $(subst ','\'',$($(quiet)cmd_$(1)))' &&) $(cmd_$(1))
+
+
+# echo command. Short version is $(quiet) equals quiet, otherwise full command
+echo-cmd = $(if $($(quiet)cmd_$(1)), \
+ echo ' $(subst ','\'',$($(quiet)cmd_$(1)))';)
+
+# function to only execute the passed command if necessary
+# >'< substitution is for echo to work,
+# >$< substitution to preserve $ when reloading .cmd file
+# note: when using inline perl scripts [perl -e '...$$t=1;...'] in
+# $(cmd_xxx) double $$ your perl vars
+#
+if_changed = $(if $(strip $? $(call arg-check, $(cmd_$(1)), $(cmd_$@)) ), \
+ @set -e; \
+ $(echo-cmd) \
+ $(cmd_$(1)); \
+ echo 'cmd_$@ := $(subst $$,$$$$,$(subst ','\'',$(cmd_$(1))))' \
+ > $(@D)/.$(@F).cmd)
+
+
+# execute the command and also postprocess generated .d dependencies
+# file
+if_changed_dep = $(if $(strip $? $(filter-out FORCE $(wildcard $^),$^) \
+ $(call arg-check, $(cmd_$(1)), $(cmd_$@)) ), \
+ @set -e; \
+ $(echo-cmd) \
+ $(cmd_$(1)); \
+ scripts/basic/fixdep $(depfile) $@ \
+ '$(subst $$,$$$$,$(subst ','\'',$(cmd_$(1))))' > $(@D)/.$(@F).tmp; \
+ rm -f $(depfile); \
+ mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd)
+
+
diff --git a/kernel/Kbuild.klibc b/kernel/Kbuild.klibc
new file mode 100644
index 0000000000000..39b8d320779ee
--- /dev/null
+++ b/kernel/Kbuild.klibc
@@ -0,0 +1,281 @@
+# ==========================================================================
+# Support for building klibc and related programs
+# ==========================================================================
+#
+# To create a kbuild file for a userspace program do the following:
+#
+# Kbuild:
+#
+# user-progs := cat
+#
+# This will compile a file named cat.c -> the executable 'cat'
+#
+# If the user space program consist of more files do the following:
+# Kbuild:
+#
+# user-progs := ipconfig
+# ipconfig-y := main.o netdev.c
+
+src := $(obj)
+
+.phony: __build
+__build:
+
+# Generic Kbuild routines
+include $(srctree)/scripts/Kbuild.include
+
+# Defines used when compiling early userspace (klibc programs)
+# ---------------------------------------------------------------------------
+KLIBSRC := usr/klibc
+
+# Arch specific definitions for klibc
+include $(KLIBSRC)/arch/$(ARCH)/MCONFIG
+
+USERWARNFLAGS := -Wall -Wpointer-arith -Wwrite-strings \
+ -Wstrict-prototypes -Winline
+
+USERCROSS := $(CROSS_COMPILE)
+
+USERLD := $(USERCROSS)ld
+USERCC := $(USERCROSS)gcc
+USERAR := $(USERCROSS)ar
+USERRANLIB := $(USERCROSS)ranlib
+USERSTRIP := $(USERCROSS)strip
+USERNM := $(USERCROSS)nm
+
+USERCPPFLAGS := -I$(srctree)/usr/include/arch/$(ARCH) \
+ -I$(srctree)/usr/include/bits$(BITSIZE) \
+ -I$(srctree)/usr/include \
+ -Iinclude \
+ $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
+ -D__KLIBC__ -DBITSIZE=$(BITSIZE)
+USERCFLAGS := $(USERCPPFLAGS) $(ARCHREQFLAGS) $(OPTFLAGS) \
+ $(USERWARNFLAGS)
+USERAFLAGS := -D__ASSEMBLY__ $(USERCPPFLAGS)
+USERSTRIPFLAGS := --strip-all -R .comment -R .note
+
+USERLIBGCC := $(shell $(USERCC) --print-libgcc)
+USERSHAREDFLAGS := $(SHAREDFLAGS)
+USERCRT0 := $(objtree)/$(KLIBSRC)/arch/$(ARCH)/crt0.o
+USERLIBC := $(objtree)/$(KLIBSRC)/libc.a
+
+#
+# This indicates the location of the final version of the shared library.
+# THIS MUST BE AN ABSOLUTE PATH WITH NO FINAL SLASH.
+# Leave this empty to make it the root.
+#
+SHLIBDIR = /lib
+
+export USERLD USERCC USERAR USERSTRIP USERNM
+export USERCFLAGS USERAFLAGS USERLIBGCC USERSHAREDFLAGS USERSTRIPFLAGS
+export USERCRT0 USERLIBC SHLIBDIR
+
+# kernel configuration
+include .config
+
+# Add $(obj)/ for paths that is not absolute
+objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o)))
+
+# Kbuild file in the directory that is being build
+include $(obj)/Kbuild
+
+#####
+# user-progs := handling
+
+# user-progs based on a single .c file (with same name)
+user-single := $(foreach p, $(user-progs), $(if $($(p)-y),,$(p)))
+
+# user-progs which is based on several .o files
+user-multi := $(foreach p, $(user-progs), $(if $($(p)-y),$(p)))
+# objects used for user-progs with more then one .o file
+user-multi-objs := $(foreach p, $(user-multi), $($(p)-y))
+# objects build in this dir
+user-real-objs := $(patsubst %/,,$(user-multi-objs))
+# Directories we need to visit before user-multi-obs are up-to-date
+user-dirs := $(patsubst %/,%,$(filter %/, $(user-multi-objs)))
+# replace all dir/ with dir/built-in.o
+user-multi-objs := $(patsubst %/, %/built-in.o, $(user-multi-objs))
+
+# $(output-dirs) are a list of directories that contain object files
+output-dirs := $(dir $(user-dirs))
+output-dirs += $(foreach f, $(hostprogs-y) $(targets), \
+ $(if $(dir $(f)), $(dir $(f))))
+output-dirs := $(strip $(sort $(filter-out ./,$(output-dirs))))
+
+# prefix so we get full dir
+user-progs := $(addprefix $(obj)/,$(user-progs))
+user-single := $(addprefix $(obj)/,$(user-single))
+user-multi := $(addprefix $(obj)/,$(user-multi))
+user-multi-objs := $(addprefix $(obj)/,$(user-multi-objs))
+user-real-objs := $(addprefix $(obj)/,$(user-real-objs))
+output-dirs := $(addprefix $(obj)/,$(output-dirs))
+user-dirs := $(addprefix $(obj)/,$(user-dirs))
+subdir-y := $(addprefix $(obj)/,$(subdir-y))
+always := $(addprefix $(obj)/,$(always))
+targets := $(addprefix $(obj)/,$(targets))
+
+
+_usercflags = $(USERCFLAGS) $(EXTRA_USERCFLAGS) $(USERCFLAGS_$(*F).o)
+_useraflags = $(USERAFLAGS) $(EXTRA_USERAFLAGS) $(USERAFLAGS_$(*F).o)
+
+usercflags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(_usercflags)
+useraflags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(_useraflags)
+
+ifneq ($(KBUILD_SRC),)
+# Create output directory if not already present
+_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
+
+# Create directories for object files if directory does not exist
+# Needed when obj-y := dir/file.o syntax is used
+_dummy := $(foreach d,$(output-dirs), $(shell [ -d $(d) ] || mkdir -p $(d)))
+endif
+
+# Do we have to make a built-in.o in this dir?
+ifneq ($(strip $(obj-y) $(obj-n) $(obj-)),)
+builtin-target := $(obj)/built-in.o
+endif
+
+__build: $(subdir-y) $(builtin-target) $(always)
+ @:
+
+# Compile C sources (.c)
+# ---------------------------------------------------------------------------
+
+quiet_cmd_cc_s_c = USERCC $@
+ cmd_cc_s_c = $(USERCC) $(usercflags) -S -o $@ $<
+
+%.s: %.c FORCE
+ $(call if_changed_dep,cc_s_c)
+
+quiet_cmd_cc_i_c = USERCPP $@
+ cmd_cc_i_c = $(USERCPP) $(usercflags) -o $@ $<
+
+%.i: %.c FORCE
+ $(call if_changed_dep,cc_i_c)
+
+quiet_cmd_cc_o_c = USERCC $@
+ cmd_cc_o_c = $(USERCC) $(usercflags) -c -o $@ $<
+
+%.o: %.c FORCE
+ $(call if_changed_dep,cc_o_c)
+
+# Compile assembler sources (.S)
+# ---------------------------------------------------------------------------
+
+quiet_cmd_as_s_S = USERCPP $@
+ cmd_as_s_S = $(USERCPP) $(useraflags) -o $@ $<
+
+%.s: %.S FORCE
+ $(call if_changed_dep,as_s_S)
+
+quiet_cmd_as_o_S = USERAS $@
+ cmd_as_o_S = $(USERCC) $(useraflags) -c -o $@ $<
+
+%.o: %.S FORCE
+ $(call if_changed_dep,as_o_S)
+
+targets += $(real-objs-y)
+
+#
+# Rule to compile a set of .o files into one .o file
+#
+ifdef builtin-target
+quiet_cmd_link_o_target = LD $@
+# If the list of objects to link is empty, just create an empty built-in.o
+cmd_link_o_target = $(if $(strip $(obj-y)),\
+ $(USERLD) $(USERLDFLAGS) -r -o $@ $(filter $(obj-y), $^),\
+ rm -f $@; $(AR) rcs $@)
+
+$(builtin-target): $(obj-y) FORCE
+ $(call if_changed,link_o_target)
+targets += $(builtin-target)
+endif # builtin-target
+
+
+ifdef user-progs
+# Compile userspace programs for the target
+# ===========================================================================
+
+__build : $(user-dirs) $(user-progs)
+
+# Descend if needed
+$(sort $(addsuffix /built-in.o,$(user-dirs))): $(user-dirs) ;
+
+quiet_cmd_user-ld-single = USERLD $@
+ cmd_user-ld-single = $(USERLD) $(USERLDFLAGS) -o $@ \
+ $(USERCRT0) $< \
+ $(filter-out FORCE,$^) \
+ $(USERLIBC) $(USERLIBGCC) \
+ $(USERLIBGCC); \
+ $(USERSTRIP) $(USERSTRIPFLAGS) $@
+
+$(user-single): %: %.o $(USERCRT0) $(USERLIBC) FORCE
+ $(call if_changed,user-ld-single)
+
+targets += $(user-single) $(user-single:=.o)
+
+multi-deps = $($(subst $(obj)/,,$@-y))
+link-multi-deps = $(addprefix $(obj)/, \
+ $(patsubst %/, %/built-in.o, $(multi-deps)))
+
+quiet_cmd_user-ld-multi = USERLD $@
+ cmd_user-ld-multi = $(USERLD) $(USERLDFLAGS) -o $@ \
+ $(USERCRT0) \
+ $(link-multi-deps) \
+ $(USERLIBC) $(USERLIBGCC) \
+ $(USERLIBGCC); \
+ $(USERSTRIP) $(USERSTRIPFLAGS) $@
+
+$(user-multi): $(user-multi-objs) FORCE
+ $(call if_changed,user-ld-multi)
+
+targets += $(user-multi) $(user-real-objs)
+endif
+
+
+# Compile programs on the host
+# ===========================================================================
+ifdef hostprogs-y
+include $(srctree)/scripts/Makefile.host
+endif
+
+# Descending
+# ---------------------------------------------------------------------------
+
+.PHONY: $(subdir-y) $(user-dirs)
+$(subdir-y) $(user-dirs):
+ $(Q)$(MAKE) $(klibc)=$@
+
+# Add FORCE to the prequisites of a target to force it to be always rebuilt.
+# ---------------------------------------------------------------------------
+
+.PHONY: FORCE
+
+FORCE:
+
+# Linking
+# Create a reloctable composite object file
+# ---------------------------------------------------------------------------
+quiet_cmd_userld = USERLD $@
+ cmd_userld = $(USERLD) -r $(USERLDFLAGS) \
+ $(EXTRA_USERLDFLAGS) $(USERLDFLAGS_$(@F)) \
+ $(filter-out FORCE,$^) -o $@
+
+
+# Read all saved command lines and dependencies for the $(targets) we
+# may be building above, using $(if_changed{,_dep}). As an
+# optimization, we don't need to read them if the target does not
+# exist, we will rebuild anyway in that case.
+
+targets := $(wildcard $(sort $(targets)))
+cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
+
+ifneq ($(cmd_files),)
+ include $(cmd_files)
+endif
+
+# Shorthand for $(Q)$(MAKE) -f scripts/Kbuild.klibc obj
+# Usage:
+# $(Q)$(MAKE) $(klibc)=dir
+klibc := -rR -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Kbuild.klibc obj
+
diff --git a/klibc/Kbuild b/klibc/Kbuild
new file mode 100644
index 0000000000000..be239a6647795
--- /dev/null
+++ b/klibc/Kbuild
@@ -0,0 +1,149 @@
+#
+# Kbuild file for klibc
+#
+
+libc-y := vsnprintf.o snprintf.o vsprintf.o sprintf.o \
+ asprintf.o vasprintf.o \
+ vsscanf.o sscanf.o ctypes.o \
+ strntoumax.o strntoimax.o \
+ atoi.o atol.o atoll.o \
+ strtol.o strtoll.o strtoul.o strtoull.o \
+ strtoimax.o strtoumax.o \
+ globals.o exitc.o atexit.o onexit.o \
+ execl.o execle.o execv.o execvpe.o execvp.o execlp.o execlpe.o \
+ fork.o wait.o wait3.o waitpid.o system.o setpgrp.o getpgrp.o \
+ daemon.o \
+ printf.o vprintf.o fprintf.o vfprintf.o perror.o \
+ statfs.o fstatfs.o umount.o \
+ open.o fopen.o fread.o fread2.o fgetc.o fgets.o \
+ fwrite.o fwrite2.o fputc.o fputs.o puts.o putchar.o \
+ sleep.o usleep.o strtotimespec.o strtotimeval.o \
+ raise.o abort.o assert.o alarm.o pause.o \
+ __signal.o sysv_signal.o bsd_signal.o siglist.o siglongjmp.o \
+ sigaction.o sigpending.o sigprocmask.o sigsuspend.o \
+ brk.o sbrk.o malloc.o realloc.o calloc.o mmap.o \
+ memcpy.o memcmp.o memset.o memccpy.o memmem.o memswap.o \
+ memmove.o memchr.o memrchr.o \
+ strcasecmp.o strncasecmp.o strndup.o strerror.o \
+ strcat.o strchr.o strcmp.o strcpy.o strdup.o strlen.o strnlen.o \
+ strncat.o strlcpy.o strlcat.o \
+ strstr.o strncmp.o strncpy.o strrchr.o \
+ strxspn.o strspn.o strcspn.o strpbrk.o strsep.o strtok.o \
+ gethostname.o getdomainname.o getcwd.o \
+ seteuid.o setegid.o \
+ getenv.o setenv.o putenv.o __put_env.o unsetenv.o \
+ getopt.o readdir.o \
+ syslog.o closelog.o pty.o getpt.o isatty.o reboot.o \
+ time.o utime.o llseek.o nice.o getpriority.o \
+ qsort.o \
+ lrand48.o jrand48.o mrand48.o nrand48.o srand48.o seed48.o \
+ inet/inet_ntoa.o inet/inet_aton.o inet/inet_addr.o \
+ inet/inet_ntop.o inet/inet_pton.o inet/bindresvport.o \
+ send.o recv.o
+
+libc-$(CONFIG_KLIBC_ERRLIST) += errlist.o
+
+libc-$(CONFIG_KLIBC_ZLIB) += \
+ zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/gzio.o \
+ zlib/uncompr.o zlib/deflate.o zlib/trees.o zlib/zutil.o \
+ zlib/inflate.o zlib/infback.o zlib/inftrees.o zlib/inffast.o
+
+#####
+# Add any architecture-specific rules
+include $(obj)/arch/$(ARCH)/Makefile.inc
+
+#####
+# Shared definitions
+LIB := libc.a
+SOLIB := libc.so
+SOHASH := klibc.so
+CRT0 := arch/$(ARCH)/crt0.o
+INTERP_O := interp.o
+
+always := $(CRT0) $(LIB) $(SOLIB) $(SOHASH) $(INTERP_O)
+LIB := $(call objectify,$(LIB))
+SOLIB := $(call objectify,$(SOLIB))
+SOHASH := $(call objectify,$(SOHASH))
+CRT0 := $(call objectify,$(CRT0))
+INTERP_O := $(call objectify,$(INTERP_O))
+
+targets := arch/$(ARCH)/crt0.o
+targets += $(libc-y) $(ARCHOBJS)
+
+# Generate syscall stubs
+subdir-y += syscalls
+# Generate socket calls stubs
+subdir-y += socketcalls
+
+# Tell make to descend before building libs
+$(obj)/syscalls/syscalls.o: $(obj)/syscalls
+$(obj)/socketcalls/socketcalls.o: $(obj)/socketcalls
+
+#####
+# Readable errormessages extracted from src..
+targets += errlist.c
+quiet_cmd_errlist = GEN $@
+ cmd_errlist = $(PERL) $< $(LINUXINCLUDE) -errlist > $@ || rm -f $@
+
+$(obj)/errlist.c: $(srctree)/$(src)/makeerrlist.pl
+ $(call cmd,errlist)
+
+# full list of dependencies for klibc
+libc-deps = $(call objectify, $(libc-y) $(ARCHOBJS)) \
+ $(call objectify, syscalls/syscalls.o socketcalls/socketcalls.o)
+
+######
+# Build static library: libc.a
+targets += libc.a __static_init.o
+quiet_cmd_libc = USERAR $@
+ cmd_libc = rm -f $@; \
+ $(USERAR) cq $@ $(filter-out FORCE,$^); \
+ $(USERRANLIB) $@
+
+$(LIB): $(call objectify,__static_init.o) $(libc-deps) FORCE
+ $(call if_changed,libc)
+
+######
+# Build shared library
+targets += libc.so __shared_init.o
+
+quiet_cmd_libcso = LD $@
+ cmd_libcso = $(USERLD) $(USERLDFLAGS) $(USERSHAREDFLAGS) \
+ -o $@ $(filter-out FORCE,$^) $(USERLIBGCC)
+
+$(SOLIB): $(CRT0) $(call objectify,__shared_init.o) $(libc-deps) FORCE
+ $(call if_changed,libcso)
+
+
+#####
+# Build sha1 hash values
+targets += klibc.so libc.so.hash
+hostprogs-y := sha1hash
+
+quiet_cmd_solibhash = HASH $@
+ cmd_solibhash = $(USERNM) $< | egrep '^[0-9a-fA-F]+ [ADRTW] ' | \
+ sort | $(obj)/sha1hash > $@
+$(SOLIB).hash: $(SOLIB) $(obj)/sha1hash FORCE
+ $(call if_changed,solibhash)
+
+quiet_cmd_sohash = GEN $@
+ cmd_sohash = cat $< > $@; \
+ $(USERSTRIP) $(USERSTRIPFLAGS) $@; \
+ rm -f $(obj)/klibc-??????????????????????.so; \
+ ln -f $@ $(obj)/klibc-`cat $(SOLIB).hash`.so
+$(SOHASH): $(SOLIB) $(SOLIB).hash
+ $(call cmd,sohash)
+
+
+#####
+# build interp.o
+targets += interp.o
+
+quiet_cmd_interp = BUILD $@
+ cmd_interp = $(USERCC) $(usercflags) -D__ASSEMBLY__ \
+ -DLIBDIR=\"$(SHLIBDIR)\" \
+ -DSOHASH=\"`cat $(SOLIB).hash`\" \
+ -c -o $@ $<
+
+$(INTERP_O): $(obj)/interp.S $(SOLIB).hash
+ $(call if_changed,interp)
diff --git a/klibc/Makefile b/klibc/Makefile
index 181a226151d80..dff813fc59a93 100644
--- a/klibc/Makefile
+++ b/klibc/Makefile
@@ -139,8 +139,8 @@ syscalls.nrs: ../include/sys/syscall.h
$(CC) $(CFLAGS) -Wp,-dM -x c -E -o $@ $<
syscalls.dir: SYSCALLS.i syscalls.pl arch/$(ARCH)/sysstub.ph syscommon.h syscalls.nrs
- rm -rf syscalls
- mkdir syscalls
+ rm -f syscalls/*.[Ssco] syscalls/*.obj
+ mkdir -p syscalls
$(PERL) syscalls.pl SYSCALLS.i arch/$(ARCH)/sysstub.ph $(ARCH) \
$(BITSIZE) syscalls.nrs \
syscalls ../include/klibc/havesyscall.h
@@ -150,8 +150,8 @@ syscalls.dir: SYSCALLS.i syscalls.pl arch/$(ARCH)/sysstub.ph syscommon.h syscall
: Generated by side effect
socketcalls.dir: SOCKETCALLS.def socketcalls.pl socketcommon.h
- rm -rf socketcalls
- mkdir socketcalls
+ rm -f socketcalls/*.[Ssco] socketcalls/*.obj
+ mkdir -p socketcalls
$(PERL) socketcalls.pl SOCKETCALLS.def $(ARCH) socketcalls
touch $@
@@ -167,8 +167,8 @@ clean: archclean
find . -type f -a \( -name \*.[isoa] -o -name \*.l[iso] \) -print0 | xargs -0rt rm -f
rm -f *.a *.so *.hash *.syms *.stripped
rm -f $(TESTS) tests/*.stripped
- rm -rf syscalls syscalls.dir
- rm -rf socketcalls socketcalls.dir
+ rm -f syscalls/*.[Ssco] syscalls/*.obj syscalls.dir
+ rm -f socketcalls/*.[Ssco] socketcalls/*.obj socketcalls.dir
rm -f sha1hash errlist.c
spotless: clean
diff --git a/klibc/socketcalls.pl b/klibc/socketcalls.pl
index 024483f716429..68f0fa164b696 100644
--- a/klibc/socketcalls.pl
+++ b/klibc/socketcalls.pl
@@ -40,7 +40,7 @@ while ( defined($line = <FILE>) ) {
push(@cargs, "$arg a".$i++);
}
$nargs = $i;
- print " \\\n\tsocketcalls/${name}.o";
+ print " \\\n\t${name}.o";
if ( $arch eq 'i386' ) {
open(OUT, '>', "${outputdir}/${name}.S")
@@ -61,7 +61,7 @@ while ( defined($line = <FILE>) ) {
open(OUT, '>', "${outputdir}/${name}.c")
or die "$0: Cannot open ${outputdir}/${name}.c\n";
- print OUT "#include \"socketcommon.h\"\n";
+ print OUT "#include \"../socketcommon.h\"\n";
print OUT "\n";
print OUT "#ifndef __NR_${name}\n\n";
diff --git a/klibc/syscalls.pl b/klibc/syscalls.pl
index 9cea63097bfff..0575fa6648104 100644
--- a/klibc/syscalls.pl
+++ b/klibc/syscalls.pl
@@ -107,7 +107,7 @@ while ( defined($line = <FILE>) ) {
@args = split(/\s*\,\s*/, $argv);
print HAVESYS "#define _KLIBC_HAVE_SYSCALL_${fname} ${sname}\n";
- print " \\\n\tsyscalls/${fname}.o";
+ print " \\\n\t${fname}.o";
make_sysstub($outputdir, $fname, $type, $sname, $stype, @args);
} else {
die "$file:$.: Could not parse input: \"$line\"\n";