Patchwork Introduce --enable-math-noprivate

login
register
mail settings
Submitter Florian Weimer
Date May 11, 2018, 3:43 p.m.
Message ID <20180511154314.83126424B00CE@oldenburg.str.redhat.com>
Download mbox | patch
Permalink /patch/27243/
State New
Headers show

Comments

Florian Weimer - May 11, 2018, 3:43 p.m.
Avoid errno@GLIBC_PRIVATE if enabled.  Additional work is needed
to eliminate further GLIBC_PRIVATE symbol references.

2018-05-11  Florian Weimer  <fweimer@redhat.com>

	Introduce --enable-math-noprivate.
	Avoid errno@GLIBC_PRIVATE if enabled.
	* config.h.in (CONFIG_MATH_NOPRIVATE): Define.
	* config.make.in (config-math-noprivate): New variable.
	* configure.ac: Recognize --enable-math-noprivate option.
	* manual/install.texi (Configuring and compiling): Document
	--enable-math-noprivate.
	* configure: Regenerate.
	* INSTALL: Likewise.
	* include/errno.h: Do not redefine errno for libm, libmvec if
	CONFIG_MATH_NOPRIVATE.
Adhemerval Zanella Netto - May 11, 2018, 4:36 p.m.
On 11/05/2018 12:43, Florian Weimer wrote:
> Avoid errno@GLIBC_PRIVATE if enabled.  Additional work is needed
> to eliminate further GLIBC_PRIVATE symbol references.

Why just not make it the default instead of adding a configure option?

> 
> 2018-05-11  Florian Weimer  <fweimer@redhat.com>
> 
> 	Introduce --enable-math-noprivate.
> 	Avoid errno@GLIBC_PRIVATE if enabled.
> 	* config.h.in (CONFIG_MATH_NOPRIVATE): Define.
> 	* config.make.in (config-math-noprivate): New variable.
> 	* configure.ac: Recognize --enable-math-noprivate option.
> 	* manual/install.texi (Configuring and compiling): Document
> 	--enable-math-noprivate.
> 	* configure: Regenerate.
> 	* INSTALL: Likewise.
> 	* include/errno.h: Do not redefine errno for libm, libmvec if
> 	CONFIG_MATH_NOPRIVATE.
> 
> diff --git a/INSTALL b/INSTALL
> index 052b1b6f89..0dc6739e42 100644
> --- a/INSTALL
> +++ b/INSTALL
> @@ -197,6 +197,13 @@ if 'CFLAGS' is specified it must enable optimization.  For example:
>       libnss_nisplus are not built at all.  Use this option to enable
>       libnsl with all depending NSS modules and header files.
>  
> +'--enable-math-noprivate'
> +     By default, libm and libmvec (if available) are built in such a way
> +     that they rely on internals in the rest of the library (notably
> +     libc).  With this option, the math libraries are built in a way
> +     that avoids such dependencies.  As a result, it is possible to use
> +     them with older versions of the library.
> +
>  '--disable-experimental-malloc'
>       By default, a per-thread cache is enabled in 'malloc'.  While this
>       cache can be disabled on a per-application basis using tunables
> diff --git a/config.h.in b/config.h.in
> index b0b7cf26cb..794f526da4 100644
> --- a/config.h.in
> +++ b/config.h.in
> @@ -156,6 +156,10 @@
>     code to link against.  */
>  #undef LINK_OBSOLETE_NSL
>  
> +/* Define as 1 if GLIBC_PRIVATE symbols should be avoided in the math
> +   libraries.  */
> +#define CONFIG_MATH_NOPRIVATE 0
> +
>  /* Define if Systemtap <sys/sdt.h> probes should be defined.  */
>  #undef USE_STAP_PROBE
>  
> diff --git a/config.make.in b/config.make.in
> index 9e5e24b2c6..d7ac4d5a7a 100644
> --- a/config.make.in
> +++ b/config.make.in
> @@ -101,6 +101,7 @@ use-nscd = @use_nscd@
>  build-hardcoded-path-in-tests= @hardcoded_path_in_tests@
>  build-pt-chown = @build_pt_chown@
>  have-tunables = @have_tunables@
> +config-math-noprivate = @config_math_noprivate@
>  
>  # Build tools.
>  CC = @CC@
> diff --git a/configure b/configure
> index 7a8bd3f817..73599affbf 100755
> --- a/configure
> +++ b/configure
> @@ -672,6 +672,7 @@ base_machine
>  have_tunables
>  build_pt_chown
>  build_nscd
> +config_math_noprivate
>  build_obsolete_nsl
>  link_obsolete_rpc
>  libc_cv_static_nss_crypt
> @@ -782,6 +783,7 @@ enable_experimental_malloc
>  enable_nss_crypt
>  enable_obsolete_rpc
>  enable_obsolete_nsl
> +enable_math_noprivate
>  enable_systemtap
>  enable_build_nscd
>  enable_nscd
> @@ -1453,6 +1455,7 @@ Optional Features:
>                            link-time usage
>    --enable-obsolete-nsl   build and install the obsolete libnsl library and
>                            depending NSS modules
> +  --enable-math-noprivate avoid GLIBC_PRIVATE symbols in math libraries
>    --enable-systemtap      enable systemtap static probe points [default=no]
>    --disable-build-nscd    disable building and installing the nscd daemon
>    --disable-nscd          library functions will not contact the nscd daemon
> @@ -3632,6 +3635,19 @@ if test "$build_obsolete_nsl" = yes; then
>  
>  fi
>  
> +# Check whether --enable-math-noprivate was given.
> +if test "${enable_math_noprivate+set}" = set; then :
> +  enableval=$enable_math_noprivate; config_math_noprivate=$enableval
> +else
> +  config_math_noprivate=no
> +fi
> +
> +
> +if test "$config_math_noprivate" = yes; then
> +  $as_echo "#define CONFIG_MATH_NOPRIVATE 1" >>confdefs.h
> +
> +fi
> +
>  # Check whether --enable-systemtap was given.
>  if test "${enable_systemtap+set}" = set; then :
>    enableval=$enable_systemtap; systemtap=$enableval
> diff --git a/configure.ac b/configure.ac
> index ca1282a6b3..f18242e276 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -378,6 +378,16 @@ if test "$build_obsolete_nsl" = yes; then
>    AC_DEFINE(LINK_OBSOLETE_NSL)
>  fi
>  
> +AC_ARG_ENABLE([math-noprivate],
> +              AC_HELP_STRING([--enable-math-noprivate],
> +                             [avoid GLIBC_PRIVATE symbols in math libraries]),
> +              [config_math_noprivate=$enableval],
> +              [config_math_noprivate=no])
> +AC_SUBST(config_math_noprivate)
> +if test "$config_math_noprivate" = yes; then
> +  AC_DEFINE(CONFIG_MATH_NOPRIVATE)
> +fi
> +
>  AC_ARG_ENABLE([systemtap],
>                [AS_HELP_STRING([--enable-systemtap],
>  	       [enable systemtap static probe points @<:@default=no@:>@])],
> diff --git a/include/errno.h b/include/errno.h
> index 457114b27a..6c0e0b94ef 100644
> --- a/include/errno.h
> +++ b/include/errno.h
> @@ -20,7 +20,8 @@
>  #  define errno rtld_errno
>  extern int rtld_errno attribute_hidden;
>  
> -# elif IS_IN_LIB && !IS_IN (rtld)
> +# elif IS_IN_LIB && !IS_IN (rtld) \
> +  && (!CONFIG_MATH_NOPRIVATE || !(IS_IN (libm) || IS_IN (libmvec)))
>  
>  #  include <tls.h>
>  
> diff --git a/manual/install.texi b/manual/install.texi
> index 4bbbfcffa5..1a131a009a 100644
> --- a/manual/install.texi
> +++ b/manual/install.texi
> @@ -230,6 +230,13 @@ libnss_nisplus are not built at all.
>  Use this option to enable libnsl with all depending NSS modules and
>  header files.
>  
> +@item --enable-math-noprivate
> +By default, libm and libmvec (if available) are built in such a way that
> +they rely on internals in the rest of the library (notably libc).  With
> +this option, the math libraries are built in a way that avoids such
> +dependencies.  As a result, it is possible to use them with older
> +versions of the library.
> +
>  @item --disable-experimental-malloc
>  By default, a per-thread cache is enabled in @code{malloc}.  While
>  this cache can be disabled on a per-application basis using tunables
>
Florian Weimer - May 11, 2018, 5:23 p.m.
On 05/11/2018 06:36 PM, Adhemerval Zanella wrote:
> 
> On 11/05/2018 12:43, Florian Weimer wrote:
>> Avoid errno@GLIBC_PRIVATE if enabled.  Additional work is needed
>> to eliminate further GLIBC_PRIVATE symbol references.

> Why just not make it the default instead of adding a configure option?

This change is perhaps appropriate (especially on x86-64, where a 
function call and indirect store is more compact that an TLS offset load 
and TLS store).  However, to remove GLIBC_PRIVATE references from the 
nan* functions and from the IFUNC resolvers (which use _rtld_global_ro 
on x86-64 and ppc64le), I need to duplicate code, and I'm not sure if 
it's appropriate to do this for such a narrow feature.

(Although the IFUNC resolvers can probably made to crash due the 
relocations they contain, but I'm still hoping for a different bugfix 
for that, which should make relocations based on non-IFUNC-symbols work 
reliably in IFUNC resolvers).

Thanks,
Florian
Florian Weimer - May 16, 2018, 4:54 a.m.
On 05/11/2018 05:43 PM, Florian Weimer wrote:
> Avoid errno@GLIBC_PRIVATE if enabled.  Additional work is needed
> to eliminate further GLIBC_PRIVATE symbol references.
> 
> 2018-05-11  Florian Weimer<fweimer@redhat.com>
> 
> 	Introduce --enable-math-noprivate.
> 	Avoid errno@GLIBC_PRIVATE if enabled.
> 	* config.h.in (CONFIG_MATH_NOPRIVATE): Define.
> 	* config.make.in (config-math-noprivate): New variable.
> 	* configure.ac: Recognize --enable-math-noprivate option.
> 	* manual/install.texi (Configuring and compiling): Document
> 	--enable-math-noprivate.
> 	* configure: Regenerate.
> 	* INSTALL: Likewise.
> 	* include/errno.h: Do not redefine errno for libm, libmvec if
> 	CONFIG_MATH_NOPRIVATE.

Ping.  These patches

<https://sourceware.org/ml/libc-alpha/2018-05/msg00501.html>
<https://sourceware.org/ml/libc-alpha/2018-05/msg00541.html>

allow building libm.so.6 without GLIBC_PRIVATE references on aarch64, 
and on x86-64 if --disable-multi-arch is also specified (I have a patch 
to add multi-arch support for the latter, but I need to come up with 
something that reduces the maintenance burden).

Thanks,
Florian

Patch

diff --git a/INSTALL b/INSTALL
index 052b1b6f89..0dc6739e42 100644
--- a/INSTALL
+++ b/INSTALL
@@ -197,6 +197,13 @@  if 'CFLAGS' is specified it must enable optimization.  For example:
      libnss_nisplus are not built at all.  Use this option to enable
      libnsl with all depending NSS modules and header files.
 
+'--enable-math-noprivate'
+     By default, libm and libmvec (if available) are built in such a way
+     that they rely on internals in the rest of the library (notably
+     libc).  With this option, the math libraries are built in a way
+     that avoids such dependencies.  As a result, it is possible to use
+     them with older versions of the library.
+
 '--disable-experimental-malloc'
      By default, a per-thread cache is enabled in 'malloc'.  While this
      cache can be disabled on a per-application basis using tunables
diff --git a/config.h.in b/config.h.in
index b0b7cf26cb..794f526da4 100644
--- a/config.h.in
+++ b/config.h.in
@@ -156,6 +156,10 @@ 
    code to link against.  */
 #undef LINK_OBSOLETE_NSL
 
+/* Define as 1 if GLIBC_PRIVATE symbols should be avoided in the math
+   libraries.  */
+#define CONFIG_MATH_NOPRIVATE 0
+
 /* Define if Systemtap <sys/sdt.h> probes should be defined.  */
 #undef USE_STAP_PROBE
 
diff --git a/config.make.in b/config.make.in
index 9e5e24b2c6..d7ac4d5a7a 100644
--- a/config.make.in
+++ b/config.make.in
@@ -101,6 +101,7 @@  use-nscd = @use_nscd@
 build-hardcoded-path-in-tests= @hardcoded_path_in_tests@
 build-pt-chown = @build_pt_chown@
 have-tunables = @have_tunables@
+config-math-noprivate = @config_math_noprivate@
 
 # Build tools.
 CC = @CC@
diff --git a/configure b/configure
index 7a8bd3f817..73599affbf 100755
--- a/configure
+++ b/configure
@@ -672,6 +672,7 @@  base_machine
 have_tunables
 build_pt_chown
 build_nscd
+config_math_noprivate
 build_obsolete_nsl
 link_obsolete_rpc
 libc_cv_static_nss_crypt
@@ -782,6 +783,7 @@  enable_experimental_malloc
 enable_nss_crypt
 enable_obsolete_rpc
 enable_obsolete_nsl
+enable_math_noprivate
 enable_systemtap
 enable_build_nscd
 enable_nscd
@@ -1453,6 +1455,7 @@  Optional Features:
                           link-time usage
   --enable-obsolete-nsl   build and install the obsolete libnsl library and
                           depending NSS modules
+  --enable-math-noprivate avoid GLIBC_PRIVATE symbols in math libraries
   --enable-systemtap      enable systemtap static probe points [default=no]
   --disable-build-nscd    disable building and installing the nscd daemon
   --disable-nscd          library functions will not contact the nscd daemon
@@ -3632,6 +3635,19 @@  if test "$build_obsolete_nsl" = yes; then
 
 fi
 
+# Check whether --enable-math-noprivate was given.
+if test "${enable_math_noprivate+set}" = set; then :
+  enableval=$enable_math_noprivate; config_math_noprivate=$enableval
+else
+  config_math_noprivate=no
+fi
+
+
+if test "$config_math_noprivate" = yes; then
+  $as_echo "#define CONFIG_MATH_NOPRIVATE 1" >>confdefs.h
+
+fi
+
 # Check whether --enable-systemtap was given.
 if test "${enable_systemtap+set}" = set; then :
   enableval=$enable_systemtap; systemtap=$enableval
diff --git a/configure.ac b/configure.ac
index ca1282a6b3..f18242e276 100644
--- a/configure.ac
+++ b/configure.ac
@@ -378,6 +378,16 @@  if test "$build_obsolete_nsl" = yes; then
   AC_DEFINE(LINK_OBSOLETE_NSL)
 fi
 
+AC_ARG_ENABLE([math-noprivate],
+              AC_HELP_STRING([--enable-math-noprivate],
+                             [avoid GLIBC_PRIVATE symbols in math libraries]),
+              [config_math_noprivate=$enableval],
+              [config_math_noprivate=no])
+AC_SUBST(config_math_noprivate)
+if test "$config_math_noprivate" = yes; then
+  AC_DEFINE(CONFIG_MATH_NOPRIVATE)
+fi
+
 AC_ARG_ENABLE([systemtap],
               [AS_HELP_STRING([--enable-systemtap],
 	       [enable systemtap static probe points @<:@default=no@:>@])],
diff --git a/include/errno.h b/include/errno.h
index 457114b27a..6c0e0b94ef 100644
--- a/include/errno.h
+++ b/include/errno.h
@@ -20,7 +20,8 @@ 
 #  define errno rtld_errno
 extern int rtld_errno attribute_hidden;
 
-# elif IS_IN_LIB && !IS_IN (rtld)
+# elif IS_IN_LIB && !IS_IN (rtld) \
+  && (!CONFIG_MATH_NOPRIVATE || !(IS_IN (libm) || IS_IN (libmvec)))
 
 #  include <tls.h>
 
diff --git a/manual/install.texi b/manual/install.texi
index 4bbbfcffa5..1a131a009a 100644
--- a/manual/install.texi
+++ b/manual/install.texi
@@ -230,6 +230,13 @@  libnss_nisplus are not built at all.
 Use this option to enable libnsl with all depending NSS modules and
 header files.
 
+@item --enable-math-noprivate
+By default, libm and libmvec (if available) are built in such a way that
+they rely on internals in the rest of the library (notably libc).  With
+this option, the math libraries are built in a way that avoids such
+dependencies.  As a result, it is possible to use them with older
+versions of the library.
+
 @item --disable-experimental-malloc
 By default, a per-thread cache is enabled in @code{malloc}.  While
 this cache can be disabled on a per-application basis using tunables