configure: When host-shared, pass --with-pic to in-tree lib configs.

Message ID 20220626152710.99667-1-iain@sandoe.co.uk
State New
Headers
Series configure: When host-shared, pass --with-pic to in-tree lib configs. |

Commit Message

Iain Sandoe June 26, 2022, 3:27 p.m. UTC
  If we are building PIC/PIE host executables, and we are building dependent
libs (e.g. GMP) in-tree those libs need to be configured to generate PIC code.

At present, if an --enable-host-shared build is attempted on ELF platforms,
with in-tree dependents, the build will fail with incompatible relocations.
One can append --with-pic to the configure, but then that is applied everywhere
not just on the libraries that need it.

Tested on  x86_64-linux-gnu "--enable-host-shared" and compared with an
"--enable-host-shared --with-pic" version,

OK for master?
comments?
thanks
Iain

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>

ChangeLog:

	* Makefile.def: Pass host_libs_picflag to host dependent library
	configures.
	* Makefile.in: Regenerate.
	* configure: Regenerate.
	* configure.ac (host_libs_picflag): New configure variable set to
	'--with-pic' when building 'host_shared'.
---
 Makefile.def |  15 +++---
 Makefile.in  | 140 +++++++++++++++++++++++++--------------------------
 configure    |  11 ++++
 configure.ac |  10 ++++
 4 files changed, 99 insertions(+), 77 deletions(-)
  

Comments

Richard Biener July 1, 2022, 8:41 a.m. UTC | #1
On Sun, Jun 26, 2022 at 5:28 PM Iain Sandoe via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> If we are building PIC/PIE host executables, and we are building dependent
> libs (e.g. GMP) in-tree those libs need to be configured to generate PIC code.
>
> At present, if an --enable-host-shared build is attempted on ELF platforms,
> with in-tree dependents, the build will fail with incompatible relocations.
> One can append --with-pic to the configure, but then that is applied everywhere
> not just on the libraries that need it.
>
> Tested on  x86_64-linux-gnu "--enable-host-shared" and compared with an
> "--enable-host-shared --with-pic" version,
>
> OK for master?
> comments?

Looks reasonable to me, so go ahead (for trunk).

Richard.

> thanks
> Iain
>
> Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
>
> ChangeLog:
>
>         * Makefile.def: Pass host_libs_picflag to host dependent library
>         configures.
>         * Makefile.in: Regenerate.
>         * configure: Regenerate.
>         * configure.ac (host_libs_picflag): New configure variable set to
>         '--with-pic' when building 'host_shared'.
> ---
>  Makefile.def |  15 +++---
>  Makefile.in  | 140 +++++++++++++++++++++++++--------------------------
>  configure    |  11 ++++
>  configure.ac |  10 ++++
>  4 files changed, 99 insertions(+), 77 deletions(-)
>
> diff --git a/Makefile.def b/Makefile.def
> index 72d58549645..92239aebb57 100644
> --- a/Makefile.def
> +++ b/Makefile.def
> @@ -50,7 +50,7 @@ host_modules= { module= gcc; bootstrap=true;
>                 extra_make_flags="$(EXTRA_GCC_FLAGS)"; };
>  host_modules= { module= gmp; lib_path=.libs; bootstrap=true;
>                 // Work around in-tree gmp configure bug with missing flex.
> -               extra_configure_flags='--disable-shared LEX="touch lex.yy.c"';
> +               extra_configure_flags='--disable-shared LEX="touch lex.yy.c" @host_libs_picflag@';
>                 extra_make_flags='AM_CFLAGS="-DNO_ASM"';
>                 no_install= true;
>                 // none-*-* disables asm optimizations, bootstrap-testing
> @@ -60,21 +60,22 @@ host_modules= { module= gmp; lib_path=.libs; bootstrap=true;
>                 // different from host for target.
>                 target="none-${host_vendor}-${host_os}"; };
>  host_modules= { module= mpfr; lib_path=src/.libs; bootstrap=true;
> -               extra_configure_flags='--disable-shared @extra_mpfr_configure_flags@';
> +               extra_configure_flags='--disable-shared @extra_mpfr_configure_flags@ @host_libs_picflag@';
>                 extra_make_flags='AM_CFLAGS="-DNO_ASM"';
>                 no_install= true; };
>  host_modules= { module= mpc; lib_path=src/.libs; bootstrap=true;
> -               extra_configure_flags='--disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@ --disable-maintainer-mode';
> +               extra_configure_flags='--disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@  @host_libs_picflag@ --disable-maintainer-mode';
>                 no_install= true; };
>  host_modules= { module= isl; lib_path=.libs; bootstrap=true;
> -               extra_configure_flags='--disable-shared @extra_isl_gmp_configure_flags@';
> +               extra_configure_flags='--disable-shared @extra_isl_gmp_configure_flags@  @host_libs_picflag@';
>                 extra_make_flags='V=1';
>                 no_install= true; };
>  host_modules= { module= libelf; lib_path=.libs; bootstrap=true;
> -               extra_configure_flags='--disable-shared';
> +               extra_configure_flags='--disable-shared  @host_libs_picflag@';
>                 no_install= true; };
>  host_modules= { module= gold; bootstrap=true; };
>  host_modules= { module= gprof; };
> +// intl acts on 'host_shared' directly, and does not support --with-pic.
>  host_modules= { module= intl; bootstrap=true; };
>  host_modules= { module= tcl;
>                  missing=mostlyclean; };
> @@ -110,7 +111,7 @@ host_modules= { module= libiberty-linker-plugin; bootstrap=true;
>  // We abuse missing to avoid installing anything for libiconv.
>  host_modules= { module= libiconv;
>                 bootstrap=true;
> -               extra_configure_flags='--disable-shared';
> +               extra_configure_flags='--disable-shared  @host_libs_picflag@';
>                 no_install= true;
>                 missing= pdf;
>                 missing= html;
> @@ -125,7 +126,7 @@ host_modules= { module= sim; };
>  host_modules= { module= texinfo; no_install= true; };
>  host_modules= { module= zlib; no_install=true; no_check=true;
>                 bootstrap=true;
> -               extra_configure_flags='@extra_host_zlib_configure_flags@';};
> +               extra_configure_flags='@extra_host_zlib_configure_flags@ @host_libs_picflag@';};
>  host_modules= { module= gnulib; };
>  host_modules= { module= gdbsupport; };
>  host_modules= { module= gdbserver; };
>
> diff --git a/configure.ac b/configure.ac
> index dcea067759d..09958bd7782 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1928,8 +1928,18 @@ AC_ARG_ENABLE(host-shared,
>    x86_64-*-darwin* | aarch64-*-darwin*) host_shared=yes ;;
>    *) host_shared=no ;;
>   esac])
> +
>  AC_SUBST(host_shared)
>
> +# If we are building PIC/PIE host executables, and we are building dependent
> +# libs (e.g. GMP) in-tree those libs need to be configured to generate PIC
> +# code.
> +host_libs_picflag=
> +if test "$host_shared" = "yes";then
> +host_libs_picflag='--with-pic'
> +fi
> +AC_SUBST(host_libs_picflag)
> +
>  # By default, C and C++ are the only stage 1 languages.
>  stage1_languages=,c,
>
> --
> 2.24.3 (Apple Git-128)
>
  

Patch

diff --git a/Makefile.def b/Makefile.def
index 72d58549645..92239aebb57 100644
--- a/Makefile.def
+++ b/Makefile.def
@@ -50,7 +50,7 @@  host_modules= { module= gcc; bootstrap=true;
 		extra_make_flags="$(EXTRA_GCC_FLAGS)"; };
 host_modules= { module= gmp; lib_path=.libs; bootstrap=true;
 		// Work around in-tree gmp configure bug with missing flex.
-		extra_configure_flags='--disable-shared LEX="touch lex.yy.c"';
+		extra_configure_flags='--disable-shared LEX="touch lex.yy.c" @host_libs_picflag@';
 		extra_make_flags='AM_CFLAGS="-DNO_ASM"';
 		no_install= true;
 		// none-*-* disables asm optimizations, bootstrap-testing
@@ -60,21 +60,22 @@  host_modules= { module= gmp; lib_path=.libs; bootstrap=true;
 		// different from host for target.
 	        target="none-${host_vendor}-${host_os}"; };
 host_modules= { module= mpfr; lib_path=src/.libs; bootstrap=true;
-		extra_configure_flags='--disable-shared @extra_mpfr_configure_flags@';
+		extra_configure_flags='--disable-shared @extra_mpfr_configure_flags@ @host_libs_picflag@';
 		extra_make_flags='AM_CFLAGS="-DNO_ASM"';
 		no_install= true; };
 host_modules= { module= mpc; lib_path=src/.libs; bootstrap=true;
-		extra_configure_flags='--disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@ --disable-maintainer-mode';
+		extra_configure_flags='--disable-shared @extra_mpc_gmp_configure_flags@ @extra_mpc_mpfr_configure_flags@  @host_libs_picflag@ --disable-maintainer-mode';
 		no_install= true; };
 host_modules= { module= isl; lib_path=.libs; bootstrap=true;
-		extra_configure_flags='--disable-shared @extra_isl_gmp_configure_flags@';
+		extra_configure_flags='--disable-shared @extra_isl_gmp_configure_flags@  @host_libs_picflag@';
 		extra_make_flags='V=1';
 		no_install= true; };
 host_modules= { module= libelf; lib_path=.libs; bootstrap=true;
-		extra_configure_flags='--disable-shared';
+		extra_configure_flags='--disable-shared  @host_libs_picflag@';
 		no_install= true; };
 host_modules= { module= gold; bootstrap=true; };
 host_modules= { module= gprof; };
+// intl acts on 'host_shared' directly, and does not support --with-pic.
 host_modules= { module= intl; bootstrap=true; };
 host_modules= { module= tcl;
                 missing=mostlyclean; };
@@ -110,7 +111,7 @@  host_modules= { module= libiberty-linker-plugin; bootstrap=true;
 // We abuse missing to avoid installing anything for libiconv.
 host_modules= { module= libiconv;
 		bootstrap=true;
-		extra_configure_flags='--disable-shared';
+		extra_configure_flags='--disable-shared  @host_libs_picflag@';
 		no_install= true;
 		missing= pdf;
 		missing= html;
@@ -125,7 +126,7 @@  host_modules= { module= sim; };
 host_modules= { module= texinfo; no_install= true; };
 host_modules= { module= zlib; no_install=true; no_check=true;
 		bootstrap=true;
-	        extra_configure_flags='@extra_host_zlib_configure_flags@';};
+	        extra_configure_flags='@extra_host_zlib_configure_flags@ @host_libs_picflag@';};
 host_modules= { module= gnulib; };
 host_modules= { module= gdbsupport; };
 host_modules= { module= gdbserver; };

diff --git a/configure.ac b/configure.ac
index dcea067759d..09958bd7782 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1928,8 +1928,18 @@  AC_ARG_ENABLE(host-shared,
   x86_64-*-darwin* | aarch64-*-darwin*) host_shared=yes ;;
   *) host_shared=no ;;
  esac])
+
 AC_SUBST(host_shared)
 
+# If we are building PIC/PIE host executables, and we are building dependent
+# libs (e.g. GMP) in-tree those libs need to be configured to generate PIC
+# code.
+host_libs_picflag=
+if test "$host_shared" = "yes";then
+host_libs_picflag='--with-pic'
+fi
+AC_SUBST(host_libs_picflag)
+
 # By default, C and C++ are the only stage 1 languages.
 stage1_languages=,c,