Wed May 8 20:04:29 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
authorroland <roland>
Thu, 9 May 1996 00:09:32 +0000 (00:09 +0000)
committerroland <roland>
Thu, 9 May 1996 00:09:32 +0000 (00:09 +0000)
* Rules (subdir_install): Depend on $(common-objpfx)sor-$(subdir).
[! libc.so-version]: Clear static-only-routines.
($(common-objpfx)sor-$(subdir)): New target.
[static-only-routines]: New static pattern rule for these .so's.
* Makerules [libc.so-version] ($(slibdir)/libc.so): Target removed.
[libc.so-version] ($(libdir)/libc.so, $(common-objpfx)libc-syms.so):
New targets replace it.
(install) [libc.so-version]: Depend on $(libdir)/libc.so instead of
$(slibdir)/libc.so.
* io/Makefile (static-only-routines): New variable.
* configure.in: Check for tools objdump and objcopy, and for awk.
* config.make.in (OBJDUMP, OBJCOPY, AWK): New variables.

Makerules
Rules
config.make.in
configure.in
io/Makefile

index d206a6e..6305ad7 100644 (file)
--- a/Makerules
+++ b/Makerules
@@ -550,7 +550,6 @@ install-lib := $(filter-out %.so %_pic.a,$(install-lib))
 ifeq (yes,$(build-shared))
 
 install-lib-nosubdir: $(install-lib.so:%=$(libdir)/%)
-install: $(slibdir)/libc.so
 
 # Find which .so's have versions.
 versioned := $(foreach so,$(install-lib.so),\
@@ -567,12 +566,29 @@ ifdef libc.so-version
 # libc.so      ->      libc.so.N       (e.g. libc.so.6)
 # libc.so.6    ->      libc-VERSION.so (e.g. libc-1.10.so)
 
-$(slibdir)/libc.so: $(slibdir)/libc.so$(libc.so-version)
-       $(make-link)
 $(slibdir)/libc.so$(libc.so-version): $(slibdir)/libc-$(version).so
        $(make-link)
 $(slibdir)/libc-$(version).so: $(common-objpfx)libc.so; $(do-install-program)
+
+# What we install as libc.so for programs to link against is in fact an
+# archive.  It contains the various $(static-only-routines) objects, and
+# the special object libc-syms.so that contains just the dynamic symbol
+# table of the shared libc object.
+install: $(libdir)/libc.so
+$(libdir)/libc.so: $(common-objpfx)libc-syms.so subdir_install
+       $(AR) crvs $@ $< `cat $(addprefix $(common-objpfx)sor-,$(subdirs))`
+
+# Extract from the shared object file just the dynamic symbol table
+# needed to link against the shared library.
+$(common-objpfx)libc-syms.so: $(common-objpfx)libc.so
+       AWK='$(AWK)' OBJCOPY='$(OBJCOPY)' OBJDUMP='$(OBJDUMP)' \
+       ./extract-dynsym $< $@
+ifndef subdir
+generated += libc-syms.so
+endif
+
 else
+install: $(slibdir)/libc.so
 $(slibdir)/libc.so: $(common-objpfx)libc.so; $(do-install-program)
 endif
 
diff --git a/Rules b/Rules
index 8d9d0a4..9a7a505 100644 (file)
--- a/Rules
+++ b/Rules
@@ -122,7 +122,33 @@ subdir_echo-distinfo:
 # our portions of the library because the parent make will install it later
 # (likewise the stubs file).
 .PHONY: subdir_install
-subdir_install: install-no-libc.a lib-noranlib stubs
+subdir_install: install-no-libc.a lib-noranlib stubs \
+               $(common-objpfx)sor-$(subdir)
+
+ifdef objpfx
+sor-objpfx = $(objpfx:../%=%)
+else
+sor-objpfx = $(subdir)
+endif
+
+ifndef libc.so-version
+# Undefine this because it can't work when we libc.so is unversioned.
+static-only-routines =
+endif
+
+# This communicates to the parent during install the set of routines that
+# need to be put into the special libc.so archive.
+$(common-objpfx)sor-$(subdir): Makefile
+       echo $(static-only-routines:%=$(sor-objpfx)%.o) > $@T
+       mv -f $@T $@
+
+ifdef static-only-routines
+# These routines are to be omitted from the shared library object,
+# so we replace the PIC objects for them with the dummy object file.
+$(static-only-routines:%=$(objpfx)%.so): %.so: $(common-objpfx) dummy.so
+       rm -f $@
+       ln $< $@
+endif
 
 .PHONY: subdir_TAGS subdir_dist
 subdir_TAGS: TAGS
index 644e5ed..a443050 100644 (file)
@@ -33,6 +33,9 @@ CC = @CC@
 AR = @AR@
 RANLIB = @RANLIB@
 AS = $(CC) -c
+OBJDUMP = @OBJDUMP@
+OBJCOPY = @OBJCOPY@
+AWK = @AWK@
 
 # Installation tools.
 INSTALL = @INSTALL@
index ed288db..d37e4d1 100644 (file)
@@ -301,9 +301,12 @@ AC_PROG_LN_S
 AC_CHECK_PROGS(MSGFMT, msgfmt gmsgfmt, :)
 
 AC_CHECK_TOOL(CC, gcc)
+AC_PROG_CPP
 AC_CHECK_TOOL(AR, ar)
 AC_CHECK_TOOL(RANLIB, ranlib, :)
-AC_PROG_CPP
+AC_CHECK_TOOL(OBJDUMP, objdump)
+AC_CHECK_TOOL(OBJCOPY, objcopy)
+AC_PROG_AWK
 
 AC_CACHE_CHECK(for signed size_t type, libc_cv_signed_size_t, [dnl
 echo '#include <stddef.h>
index 691ac03..ce8708c 100644 (file)
@@ -45,6 +45,11 @@ routines :=                                                        \
        unlink rmdir                                                  \
        ftw fts poll
 
+# These routines will be omitted from the libc shared object.
+# Instead the static object files will be included in a special archive
+# linked against when the shared library will be used.
+static-only-routines = stat fstat lstat mknod
+
 others         := pwd
 tests          := test-utime