diff mbox

Add --enable-host-shared configuration option

Message ID 1381364733-32475-1-git-send-email-dmalcolm@redhat.com
State New
Headers show

Commit Message

David Malcolm Oct. 10, 2013, 12:25 a.m. UTC
My JIT branch requires embedding GCC's code as a shared library on the
host.  To do requires building the host code as position-independent,
which unfortunately incurs a small speed hit.

Hence we need a configuration option, so that you can opt-in to
position-independent host code.

This patch adds an "--enable-host-shared" option throughout the various
configure/Make machinery for host code, adding "-fPIC" where appropriate
when enabled.

It is equivalent to the changes I currently have on my "dmalcolm/jit"
branch in git.

My first time attempt at this handled --enable-host-shared by detecting
it in each child "configure" script (as generated from configure.ac) and
conditionally appending -fPIC to makefile variables such as CFLAGS,
CXXFLAGS and LDFLAGS.

This worked when invoking "make" from each subdirectory, but not when
running "make" in the top-level directory: the top-level make would
pass in "CFLAGS=-g -O2" to the child makes, overriding their CFLAGS,
thus erroneously omitting the "-fPIC" flag.

This patch instead adds a PICFLAG variable, set up in the child
configure scripts, to contain -fPIC if configured with
--enable-host-shared.  The PICFLAG variable is then added to an
appropriate variable in each child makefile to ensure that it is used
when building host code.

This ensures that -fPIC is present if requested, when building both
from the top-level directory, and from the child directories.

There's precedent for both "PICFLAG" and "PIC_FLAG" in the source tree:
libiberty uses "PICFLAG", libbacktrace usss "PIC_FLAG".  I went with
"PICFLAG" for the new flags.

The patch uses -fPIC rather than -fpic.

Successfully bootstrapped and regtesting on x86_64-unknown-linux.

OK for trunk?

ChangeLog follows inline:

/
	* configure.ac: Add --enable-host-shared
	* configure: Regenerate.

gcc/
	* Makefile.in (PICFLAG): New.
	(enable_host_shared): New.
	(INTERNAL_CFLAGS): Use PICFLAG.
	(LIBIBERTY): Use pic build of libiberty.a if configured with
	--enable-host-shared.
	* configure.ac: Add --enable-host-shared, setting up new
	PICFLAG variable.
	* configure: Regenerate.

libbacktrace/
	* configure.ac: Add --enable-host-shared, setting up
	pre-existing PIC_FLAG variable within Makefile.am et al.
	* configure: Regenerate.

libcpp/
	* Makefile.in (PICFLAG): New.
	(ALL_CFLAGS): Add PICFLAG.
	(ALL_CXXFLAGS): Likewise.
	* configure.ac: Add --enable-host-shared, setting up new
	PICFLAG variable.
	* configure: Regenerate.

libdecnumber/
	* Makefile.in (PICFLAG): New.
	(ALL_CFLAGS): Add PICFLAG.
	* configure.ac: Add --enable-host-shared, setting up new
	PICFLAG variable.
	* configure: Regenerate.

libiberty/
	* configure.ac: If --enable-host-shared, use -fPIC.
	* configure: Regenerate.

zlib/
	* configure.ac: Add --enable-host-shared, setting up new
	PICFLAG variable.
	* Makefile.am: Add PICFLAG to libz_a_CFLAGS.
	* Makefile.in: Regenerate.
	* configure: Regenerate.
---
 configure                 | 13 +++++++++++++
 configure.ac              |  7 +++++++
 gcc/Makefile.in           | 14 +++++++++++++-
 gcc/configure             | 20 ++++++++++++++++++--
 gcc/configure.ac          |  9 +++++++++
 libbacktrace/configure    | 12 ++++++++++--
 libbacktrace/configure.ac |  5 +++++
 libcpp/Makefile.in        |  5 +++--
 libcpp/configure          | 13 +++++++++++++
 libcpp/configure.ac       |  7 +++++++
 libdecnumber/Makefile.in  |  3 ++-
 libdecnumber/configure    | 13 +++++++++++++
 libdecnumber/configure.ac |  7 +++++++
 libiberty/configure       |  6 ++++++
 libiberty/configure.ac    |  6 ++++++
 zlib/Makefile.am          |  2 +-
 zlib/Makefile.in          |  3 ++-
 zlib/configure            | 16 ++++++++++++++--
 zlib/configure.ac         |  6 ++++++
 19 files changed, 155 insertions(+), 12 deletions(-)

Comments

Joseph Myers Oct. 10, 2013, 1:05 a.m. UTC | #1
On Wed, 9 Oct 2013, David Malcolm wrote:

> This patch adds an "--enable-host-shared" option throughout the various
> configure/Make machinery for host code, adding "-fPIC" where appropriate
> when enabled.

Please document this in install.texi (even if it isn't particularly useful 
at the stage where it just means PIC rather than actual shared libraries).
Jeff Law Oct. 15, 2013, 4:29 p.m. UTC | #2
On 10/09/13 18:25, David Malcolm wrote:
> My JIT branch requires embedding GCC's code as a shared library on the
> host.  To do requires building the host code as position-independent,
> which unfortunately incurs a small speed hit.
Obviously this is an opt-in right now, so I'm not terribly concerned.

>
> My first time attempt at this handled --enable-host-shared by detecting
> it in each child "configure" script (as generated from configure.ac) and
> conditionally appending -fPIC to makefile variables such as CFLAGS,
> CXXFLAGS and LDFLAGS.
>
> This worked when invoking "make" from each subdirectory, but not when
> running "make" in the top-level directory: the top-level make would
> pass in "CFLAGS=-g -O2" to the child makes, overriding their CFLAGS,
> thus erroneously omitting the "-fPIC" flag.
Yea.  This stuff (particularly the overriding of flags) is a mess and 
far from obvious IMHO.  But I don't think fixing that is "in scope" for 
what you're working on.

>
> This patch instead adds a PICFLAG variable, set up in the child
> configure scripts, to contain -fPIC if configured with
> --enable-host-shared.  The PICFLAG variable is then added to an
> appropriate variable in each child makefile to ensure that it is used
> when building host code.
Seems reasonable -- particularly since you've tested it both with a 
toplevel invocation and invocations in subdirectories.

>
> There's precedent for both "PICFLAG" and "PIC_FLAG" in the source tree:
> libiberty uses "PICFLAG", libbacktrace usss "PIC_FLAG".  I went with
> "PICFLAG" for the new flags.
But of course...

>
> The patch uses -fPIC rather than -fpic.
Right.


>
> Successfully bootstrapped and regtesting on x86_64-unknown-linux.
>
> OK for trunk?
>
> ChangeLog follows inline:
>
> /
> 	* configure.ac: Add --enable-host-shared
> 	* configure: Regenerate.
>
> gcc/
> 	* Makefile.in (PICFLAG): New.
> 	(enable_host_shared): New.
> 	(INTERNAL_CFLAGS): Use PICFLAG.
> 	(LIBIBERTY): Use pic build of libiberty.a if configured with
> 	--enable-host-shared.
> 	* configure.ac: Add --enable-host-shared, setting up new
> 	PICFLAG variable.
> 	* configure: Regenerate.
>
> libbacktrace/
> 	* configure.ac: Add --enable-host-shared, setting up
> 	pre-existing PIC_FLAG variable within Makefile.am et al.
> 	* configure: Regenerate.
>
> libcpp/
> 	* Makefile.in (PICFLAG): New.
> 	(ALL_CFLAGS): Add PICFLAG.
> 	(ALL_CXXFLAGS): Likewise.
> 	* configure.ac: Add --enable-host-shared, setting up new
> 	PICFLAG variable.
> 	* configure: Regenerate.
>
> libdecnumber/
> 	* Makefile.in (PICFLAG): New.
> 	(ALL_CFLAGS): Add PICFLAG.
> 	* configure.ac: Add --enable-host-shared, setting up new
> 	PICFLAG variable.
> 	* configure: Regenerate.
>
> libiberty/
> 	* configure.ac: If --enable-host-shared, use -fPIC.
> 	* configure: Regenerate.
>
> zlib/
> 	* configure.ac: Add --enable-host-shared, setting up new
> 	PICFLAG variable.
> 	* Makefile.am: Add PICFLAG to libz_a_CFLAGS.
> 	* Makefile.in: Regenerate.
> 	* configure: Regenerate.
Presumably other host libraries we depend on such as gmp, mpc, etc are 
available in shared (or at least PIC) form as well?  Obviously these are 
out of our source tree and largely out of our control, but I'm a bit 
curious if there's other host libraries that may cause you headaches in 
the future.

This is fine with the install.texi changes Joseph wanted.

jeff
David Malcolm Oct. 15, 2013, 8:41 p.m. UTC | #3
On Tue, 2013-10-15 at 10:29 -0600, Jeff Law wrote:
> On 10/09/13 18:25, David Malcolm wrote:
[...]

> Presumably other host libraries we depend on such as gmp, mpc, etc are 
> available in shared (or at least PIC) form as well?  Obviously these are 
> out of our source tree and largely out of our control, but I'm a bit 
> curious if there's other host libraries that may cause you headaches in 
> the future.

Yes, on this Fedora box:
$ file /usr/lib64/libgmp.so.10.0.2
/usr/lib64/libgmp.so.10.0.2: ELF 64-bit LSB shared object, x86-64,
version 1 (SYSV), dynamically linked,
BuildID[sha1]=0x6fb87c7b6e9aa56e4a09a3fbd496a9ee2dadbdc2, stripped

$ file /usr/lib64/libmpc.so.2.0.0 
/usr/lib64/libmpc.so.2.0.0: ELF 64-bit LSB shared object, x86-64,
version 1 (SYSV), dynamically linked,
BuildID[sha1]=0x7fb16b27ba6412301c4efab4b9c0c3a09bb3c95d, stripped

> This is fine with the install.texi changes Joseph wanted.

Thanks; I've committed the combined patch to trunk as r203632.

> zlib/
> 	* configure.ac: Add --enable-host-shared, setting up new
> > 	PICFLAG variable.
> > 	* Makefile.am: Add PICFLAG to libz_a_CFLAGS.
> > 	* Makefile.in: Regenerate.
> > 	* configure: Regenerate.
> 

Incidentally, on committing this I noticed that zlib/ChangeLog is from
upstream zlib.  The downstream changes to gcc appear to be being
recorded into zlib/ChangeLog.gcj (I assume due to historical accident)
so I added the zlib changelog entries here.  I hope that's OK.

Dave
diff mbox

Patch

diff --git a/configure b/configure
index 6ad3c49..d62285c 100755
--- a/configure
+++ b/configure
@@ -556,6 +556,7 @@  enable_option_checking=no
 ac_subst_vars='LTLIBOBJS
 LIBOBJS
 compare_exclusions
+host_shared
 stage2_werror_flag
 stage1_checking
 stage1_cflags
@@ -787,6 +788,7 @@  with_build_time_tools
 enable_maintainer_mode
 enable_stage1_checking
 enable_werror
+enable_host_shared
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1490,6 +1492,7 @@  Optional Features:
                           choose additional checking for stage1 of the
                           compiler
   --enable-werror         enable -Werror in bootstrap stage2 and later
+  --enable-host-shared    build host code as shared libraries
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -14570,6 +14573,16 @@  case ${enable_werror} in
 esac
 
 
+# Enable --enable-host-shared.
+# Check whether --enable-host-shared was given.
+if test "${enable_host_shared+set}" = set; then :
+  enableval=$enable_host_shared; host_shared=$enableval
+else
+  host_shared=no
+fi
+
+
+
 # Specify what files to not compare during bootstrap.
 
 compare_exclusions="gcc/cc*-checksum\$(objext) | gcc/ada/*tools/*"
diff --git a/configure.ac b/configure.ac
index b5caebb..4c23652 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3301,6 +3301,13 @@  case ${enable_werror} in
 esac
 AC_SUBST(stage2_werror_flag)
 
+# Enable --enable-host-shared.
+AC_ARG_ENABLE(host-shared,
+[AS_HELP_STRING([--enable-host-shared],
+		[build host code as shared libraries])],
+[host_shared=$enableval], [host_shared=no])
+AC_SUBST(host_shared)
+
 # Specify what files to not compare during bootstrap.
 
 compare_exclusions="gcc/cc*-checksum\$(objext) | gcc/ada/*tools/*"
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 4e396aa..ee19ca2 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -135,6 +135,9 @@  CFLAGS = @CFLAGS@
 CXXFLAGS = @CXXFLAGS@
 LDFLAGS = @LDFLAGS@
 
+# Should we build position-independent host code?
+PICFLAG = @PICFLAG@
+
 # Flags to determine code coverage. When coverage is disabled, this will
 # contain the optimization flags, as you normally want code coverage
 # without optimization.
@@ -346,6 +349,8 @@  PLUGINLIBS = @pluginlibs@
 
 enable_plugin = @enable_plugin@
 
+enable_host_shared = @enable_host_shared@
+
 CPPLIB = ../libcpp/libcpp.a
 CPPINC = -I$(srcdir)/../libcpp/include
 
@@ -955,7 +960,7 @@  CONTEXT_H = context.h
 # programs built during a bootstrap.
 # autoconf inserts -DCROSS_DIRECTORY_STRUCTURE if we are building a
 # cross compiler which does not use the native headers and libraries.
-INTERNAL_CFLAGS = -DIN_GCC @CROSS@
+INTERNAL_CFLAGS = -DIN_GCC $(PICFLAG) @CROSS@
 
 # This is the variable actually used when we compile. If you change this,
 # you probably want to update BUILD_CFLAGS in configure.ac
@@ -978,8 +983,15 @@  ALL_COMPILERFLAGS = $(ALL_CXXFLAGS)
 ALL_LINKERFLAGS = $(ALL_CXXFLAGS)
 
 # Build and host support libraries.
+
+# Use the "pic" build of libiberty if --enable-host-shared.
+ifeq ($(enable_host_shared),yes)
+LIBIBERTY = ../libiberty/pic/libiberty.a
+BUILD_LIBIBERTY = $(build_libobjdir)/libiberty/pic/libiberty.a
+else
 LIBIBERTY = ../libiberty/libiberty.a
 BUILD_LIBIBERTY = $(build_libobjdir)/libiberty/libiberty.a
+endif
 
 # Dependencies on the intl and portability libraries.
 LIBDEPS= libcommon.a $(CPPLIB) $(LIBIBERTY) $(LIBINTL_DEP) $(LIBICONV_DEP) \
diff --git a/gcc/configure b/gcc/configure
index 2ac0347..40043bb 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -600,6 +600,8 @@  ac_includes_default="\
 
 ac_subst_vars='LTLIBOBJS
 LIBOBJS
+PICFLAG
+enable_host_shared
 enable_plugin
 pluginlibs
 CLOOGINC
@@ -921,6 +923,7 @@  enable_maintainer_mode
 enable_link_mutex
 enable_version_specific_runtime_libs
 enable_plugin
+enable_host_shared
 enable_libquadmath_support
 with_linker_hash_style
 '
@@ -1636,6 +1639,7 @@  Optional Features:
                           specify that runtime libraries should be installed
                           in a compiler-specific directory
   --enable-plugin         enable plugin support
+  --enable-host-shared    build host code as shared libraries
   --disable-libquadmath-support
                           disable libquadmath support for Fortran
 
@@ -17893,7 +17897,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 17896 "configure"
+#line 17900 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -17999,7 +18003,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 18002 "configure"
+#line 18006 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -27694,6 +27698,18 @@  $as_echo "#define ENABLE_PLUGIN 1" >>confdefs.h
 fi
 
 
+# Enable --enable-host-shared
+# Check whether --enable-host-shared was given.
+if test "${enable_host_shared+set}" = set; then :
+  enableval=$enable_host_shared; PICFLAG=-fPIC
+else
+  PICFLAG=
+fi
+
+
+
+
+
 # Check whether --enable-libquadmath-support was given.
 if test "${enable_libquadmath_support+set}" = set; then :
   enableval=$enable_libquadmath_support; ENABLE_LIBQUADMATH_SUPPORT=$enableval
diff --git a/gcc/configure.ac b/gcc/configure.ac
index f216962..5111109 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -5399,6 +5399,15 @@  if test x"$enable_plugin" = x"yes"; then
 fi
 
 
+# Enable --enable-host-shared
+AC_ARG_ENABLE(host-shared,
+[AS_HELP_STRING([--enable-host-shared],
+		[build host code as shared libraries])],
+[PICFLAG=-fPIC], [PICFLAG=])
+AC_SUBST(enable_host_shared)
+AC_SUBST(PICFLAG)
+
+
 AC_ARG_ENABLE(libquadmath-support,
 [AS_HELP_STRING([--disable-libquadmath-support],
   [disable libquadmath support for Fortran])],
diff --git a/libbacktrace/configure b/libbacktrace/configure
index e8ef1ff..e6b13c0 100755
--- a/libbacktrace/configure
+++ b/libbacktrace/configure
@@ -731,6 +731,7 @@  with_gnu_ld
 enable_libtool_lock
 enable_multilib
 with_system_libunwind
+enable_host_shared
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1369,6 +1370,7 @@  Optional Features:
                           optimize for fast installation [default=yes]
   --disable-libtool-lock  avoid locking (might break parallel builds)
   --enable-multilib       build many library versions (default)
+  --enable-host-shared    build host code as shared libraries
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -11087,7 +11089,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11090 "configure"
+#line 11092 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11193,7 +11195,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11196 "configure"
+#line 11198 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11696,6 +11698,12 @@  PIC_FLAG=
 if test -n "${with_target_subdir}"; then
   PIC_FLAG=-fPIC
 fi
+# Similarly, use -fPIC with --enable-host-shared:
+# Check whether --enable-host-shared was given.
+if test "${enable_host_shared+set}" = set; then :
+  enableval=$enable_host_shared; PIC_FLAG=-fPIC
+fi
+
 
 
 # Test for __sync support.
diff --git a/libbacktrace/configure.ac b/libbacktrace/configure.ac
index 28b2a1c..48c8620 100644
--- a/libbacktrace/configure.ac
+++ b/libbacktrace/configure.ac
@@ -165,6 +165,11 @@  PIC_FLAG=
 if test -n "${with_target_subdir}"; then
   PIC_FLAG=-fPIC
 fi
+# Similarly, use -fPIC with --enable-host-shared:
+AC_ARG_ENABLE(host-shared,
+[AS_HELP_STRING([--enable-host-shared],
+		[build host code as shared libraries])],
+[PIC_FLAG=-fPIC], [])
 AC_SUBST(PIC_FLAG)
 
 # Test for __sync support.
diff --git a/libcpp/Makefile.in b/libcpp/Makefile.in
index 2353c9c..30bf896 100644
--- a/libcpp/Makefile.in
+++ b/libcpp/Makefile.in
@@ -57,6 +57,7 @@  CCDEPMODE = @CCDEPMODE@
 CXXDEPMODE = @CXXDEPMODE@
 DEPDIR = @DEPDIR@
 NOEXCEPTION_FLAGS = @noexception_flags@
+PICFLAG = @PICFLAG@
 
 datarootdir = @datarootdir@
 datadir = @datadir@
@@ -72,9 +73,9 @@  depcomp = $(SHELL) $(srcdir)/../depcomp
 INCLUDES = -I$(srcdir) -I. -I$(srcdir)/../include @INCINTL@ \
 	-I$(srcdir)/include
 
-ALL_CFLAGS = $(CFLAGS) $(WARN_CFLAGS) $(INCLUDES) $(CPPFLAGS)
+ALL_CFLAGS = $(CFLAGS) $(WARN_CFLAGS) $(INCLUDES) $(CPPFLAGS) $(PICFLAG)
 ALL_CXXFLAGS = $(CXXFLAGS) $(WARN_CXXFLAGS) $(NOEXCEPTION_FLAGS) $(INCLUDES) \
-	$(CPPFLAGS)
+	$(CPPFLAGS) $(PICFLAG)
 
 # The name of the compiler to use.
 COMPILER = $(CXX)
diff --git a/libcpp/configure b/libcpp/configure
index 60ce2e5..782a710 100755
--- a/libcpp/configure
+++ b/libcpp/configure
@@ -592,6 +592,7 @@  ac_includes_default="\
 #endif"
 
 ac_subst_vars='LTLIBOBJS
+PICFLAG
 MAINT
 USED_CATALOGS
 PACKAGE
@@ -701,6 +702,7 @@  with_libiconv_prefix
 enable_maintainer_mode
 enable_checking
 enable_canonical_system_headers
+enable_host_shared
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1340,6 +1342,7 @@  Optional Features:
                           other strings
   --enable-canonical-system-headers
                           enable or disable system headers canonicalization
+  --enable-host-shared    build host code as shared libraries
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -7204,6 +7207,16 @@  fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 esac
 
+# Enable --enable-host-shared.
+# Check whether --enable-host-shared was given.
+if test "${enable_host_shared+set}" = set; then :
+  enableval=$enable_host_shared; PICFLAG=-fPIC
+else
+  PICFLAG=
+fi
+
+
+
 # Output.
 
 ac_config_headers="$ac_config_headers config.h:config.in"
diff --git a/libcpp/configure.ac b/libcpp/configure.ac
index 799301f..a70603c 100644
--- a/libcpp/configure.ac
+++ b/libcpp/configure.ac
@@ -220,6 +220,13 @@  case $target in
 		 [Define to 1 if you can assemble SSE4 insns.])])
 esac
 
+# Enable --enable-host-shared.
+AC_ARG_ENABLE(host-shared,
+[AS_HELP_STRING([--enable-host-shared],
+		[build host code as shared libraries])],
+[PICFLAG=-fPIC], [PICFLAG=])
+AC_SUBST(PICFLAG)
+
 # Output.
 
 AC_CONFIG_HEADERS(config.h:config.in, [echo timestamp > stamp-h1])
diff --git a/libdecnumber/Makefile.in b/libdecnumber/Makefile.in
index e67ff27..b6f3842 100644
--- a/libdecnumber/Makefile.in
+++ b/libdecnumber/Makefile.in
@@ -40,6 +40,7 @@  INSTALL_PROGRAM = @INSTALL_PROGRAM@
 LDFLAGS = @LDFLAGS@
 LIBICONV = @LIBICONV@
 PACKAGE = @PACKAGE@
+PICFLAG = @PICFLAG@
 RANLIB = @RANLIB@
 SHELL = @SHELL@
 objext = @OBJEXT@
@@ -57,7 +58,7 @@  enable_decimal_float= @enable_decimal_float@
 
 INCLUDES = -I$(srcdir) -I.
 
-ALL_CFLAGS = $(CFLAGS) $(WARN_CFLAGS) $(INCLUDES) $(CPPFLAGS)
+ALL_CFLAGS = $(CFLAGS) $(WARN_CFLAGS) $(INCLUDES) $(CPPFLAGS) $(PICFLAG)
 
 bid_OBJS = bid2dpd_dpd2bid.$(objext) host-ieee32.$(objext) \
 	host-ieee64.$(objext) host-ieee128.$(objext)
diff --git a/libdecnumber/configure b/libdecnumber/configure
index 4a1896e..2720f46 100755
--- a/libdecnumber/configure
+++ b/libdecnumber/configure
@@ -593,6 +593,7 @@  ac_includes_default="\
 
 ac_subst_vars='LTLIBOBJS
 LIBOBJS
+PICFLAG
 ADDITIONAL_OBJS
 enable_decimal_float
 target_os
@@ -670,6 +671,7 @@  enable_option_checking
 enable_werror_always
 enable_maintainer_mode
 enable_decimal_float
+enable_host_shared
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1301,6 +1303,7 @@  Optional Features:
 			enable decimal float extension to C.  Selecting 'bid'
 			or 'dpd' choses which decimal floating point format
 			to use
+  --enable-host-shared    build host code as shared libraries
 
 Some influential environment variables:
   CC          C compiler command
@@ -4889,6 +4892,16 @@  $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
  esac
 
 
+# Enable --enable-host-shared.
+# Check whether --enable-host-shared was given.
+if test "${enable_host_shared+set}" = set; then :
+  enableval=$enable_host_shared; PICFLAG=-fPIC
+else
+  PICFLAG=
+fi
+
+
+
 # Output.
 
 ac_config_headers="$ac_config_headers config.h:config.in"
diff --git a/libdecnumber/configure.ac b/libdecnumber/configure.ac
index 6cfc803..dd0499c 100644
--- a/libdecnumber/configure.ac
+++ b/libdecnumber/configure.ac
@@ -95,6 +95,13 @@  AC_SUBST(ADDITIONAL_OBJS)
 
 AC_C_BIGENDIAN
 
+# Enable --enable-host-shared.
+AC_ARG_ENABLE(host-shared,
+[AS_HELP_STRING([--enable-host-shared],
+		[build host code as shared libraries])],
+[PICFLAG=-fPIC], [PICFLAG=])
+AC_SUBST(PICFLAG)
+
 # Output.
 
 AC_CONFIG_HEADERS(config.h:config.in, [echo timestamp > stamp-h1])
diff --git a/libiberty/configure b/libiberty/configure
index e601ccd..b71141a 100755
--- a/libiberty/configure
+++ b/libiberty/configure
@@ -4963,6 +4963,12 @@  case "${enable_shared}" in
   "") shared=no ;;
   *) shared=yes ;;
 esac
+
+# ...unless --enable-host-shared was passed from top-level config:
+if [ "${enable_host_shared}" = "yes" ]; then
+  shared=yes
+fi
+
 if [ "${shared}" != "yes" ]; then
   PICFLAG=
 fi
diff --git a/libiberty/configure.ac b/libiberty/configure.ac
index fcea46f..4ad88a9 100644
--- a/libiberty/configure.ac
+++ b/libiberty/configure.ac
@@ -225,6 +225,12 @@  case "${enable_shared}" in
   "") shared=no ;;
   *) shared=yes ;;
 esac
+
+# ...unless --enable-host-shared was passed from top-level config:
+if [[ "${enable_host_shared}" = "yes" ]]; then
+  shared=yes
+fi
+
 if [[ "${shared}" != "yes" ]]; then
   PICFLAG=
 fi
diff --git a/zlib/Makefile.am b/zlib/Makefile.am
index a9c42cb..82f709d 100644
--- a/zlib/Makefile.am
+++ b/zlib/Makefile.am
@@ -16,7 +16,7 @@  libzgcj_convenience_la_SOURCES = $(ZLIB_SOURCES)
 else
 toolexeclib_LIBRARIES = libz.a
 libz_a_SOURCES = $(ZLIB_SOURCES)
-libz_a_CFLAGS = $(AM_CFLAGS)
+libz_a_CFLAGS = $(AM_CFLAGS) $(PICFLAG)
 endif
 
 # Work around what appears to be a GNU make bug handling MAKEFLAGS
diff --git a/zlib/Makefile.in b/zlib/Makefile.in
index f5ef37a..3c8fd59 100644
--- a/zlib/Makefile.in
+++ b/zlib/Makefile.in
@@ -177,6 +177,7 @@  PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PICFLAG = @PICFLAG@
 RANLIB = @RANLIB@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
@@ -255,7 +256,7 @@  zconf.h.in zlib.h zutil.c zutil.h
 @TARGET_LIBRARY_TRUE@libzgcj_convenience_la_SOURCES = $(ZLIB_SOURCES)
 @TARGET_LIBRARY_FALSE@toolexeclib_LIBRARIES = libz.a
 @TARGET_LIBRARY_FALSE@libz_a_SOURCES = $(ZLIB_SOURCES)
-@TARGET_LIBRARY_FALSE@libz_a_CFLAGS = $(AM_CFLAGS)
+@TARGET_LIBRARY_FALSE@libz_a_CFLAGS = $(AM_CFLAGS) $(PICFLAG)
 
 # Work around what appears to be a GNU make bug handling MAKEFLAGS
 # values defined in terms of make variables, as is the case for CC and
diff --git a/zlib/configure b/zlib/configure
index c71984f..32e33e7 100755
--- a/zlib/configure
+++ b/zlib/configure
@@ -602,6 +602,7 @@  ac_subst_vars='am__EXEEXT_FALSE
 am__EXEEXT_TRUE
 LTLIBOBJS
 LIBOBJS
+PICFLAG
 TARGET_LIBRARY_FALSE
 TARGET_LIBRARY_TRUE
 toolexeclibdir
@@ -736,6 +737,7 @@  with_pic
 enable_fast_install
 with_gnu_ld
 enable_libtool_lock
+enable_host_shared
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1370,6 +1372,7 @@  Optional Features:
   --enable-fast-install[=PKGS]
                           optimize for fast installation [default=yes]
   --disable-libtool-lock  avoid locking (might break parallel builds)
+  --enable-host-shared    build host code as shared libraries
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -10400,7 +10403,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10403 "configure"
+#line 10406 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -10506,7 +10509,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10509 "configure"
+#line 10512 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11202,6 +11205,15 @@  else
   multilib_arg=
 fi
 
+# Check whether --enable-host-shared was given.
+if test "${enable_host_shared+set}" = set; then :
+  enableval=$enable_host_shared; PICFLAG=-fPIC
+else
+  PICFLAG=
+fi
+
+
+
 ac_config_files="$ac_config_files Makefile"
 
 cat >confcache <<\_ACEOF
diff --git a/zlib/configure.ac b/zlib/configure.ac
index 80253e4..fb8d943 100644
--- a/zlib/configure.ac
+++ b/zlib/configure.ac
@@ -119,5 +119,11 @@  else
   multilib_arg=
 fi
 
+AC_ARG_ENABLE(host-shared,
+[AS_HELP_STRING([--enable-host-shared],
+		[build host code as shared libraries])],
+[PICFLAG=-fPIC], [PICFLAG=])
+AC_SUBST(PICFLAG)
+
 AC_CONFIG_FILES([Makefile])
 AC_OUTPUT