Message ID | 20180511154314.83126424B00CE@oldenburg.str.redhat.com |
---|---|
State | New |
Headers | show |
Series | Introduce --enable-math-noprivate | expand |
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 >
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
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
On 05/16/2018 06:54 AM, Florian Weimer wrote: > 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). Ping? What's the general feeling regarding this feature? Thanks, Florian
On 07/06/18 14:38, Florian Weimer wrote: > On 05/16/2018 06:54 AM, Florian Weimer wrote: >> 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). > > Ping? > > What's the general feeling regarding this feature? independently updatable libm can be useful (or something that works from an LD_LIBRARY_PATH) when users of a very-stable-distro want to use the latest libm (assuming libm improves over time) or somebody wants to provide a libm with different precision guarantees. but i can see that ifunc may be ugly to implement. (or soft float, or fenv or strtod using nan) if one updates libm.so will that also update math.h? or we just want a libm with backward compatible abi? either way i think it should be possible to do and since glibc is currently very hard to update on a system it can be useful.
On 08/06/2018 06:03, Szabolcs Nagy wrote: > On 07/06/18 14:38, Florian Weimer wrote: >> On 05/16/2018 06:54 AM, Florian Weimer wrote: >>> 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). >> >> Ping? >> >> What's the general feeling regarding this feature? > > independently updatable libm can be useful > (or something that works from an LD_LIBRARY_PATH) > when users of a very-stable-distro want to use the > latest libm (assuming libm improves over time) or > somebody wants to provide a libm with different > precision guarantees. > > but i can see that ifunc may be ugly to implement. > (or soft float, or fenv or strtod using nan) > > if one updates libm.so will that also update math.h? > or we just want a libm with backward compatible abi? > either way i think it should be possible to do and > since glibc is currently very hard to update on a > system it can be useful. I think it should be a transitional configuration option with a plan to make it default and later remove it once we have all bits upstream (maybe next release). Which kind of fixes do you see it still requires to make it a default option?
On 06/08/2018 11:03 AM, Szabolcs Nagy wrote: >>> 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). >> >> Ping? >> >> What's the general feeling regarding this feature? > > independently updatable libm can be useful > (or something that works from an LD_LIBRARY_PATH) > when users of a very-stable-distro want to use the > latest libm (assuming libm improves over time) or > somebody wants to provide a libm with different > precision guarantees. > > but i can see that ifunc may be ugly to implement. > (or soft float, or fenv or strtod using nan) The strtod/nan part should be covered by the second patch. I don't know yet what the problems with soft float will be. To be honest, I'm not particularly interested in soft-float. 8-/ IFUNC handling need per-architecture changes. On some targets, it simply means removing IFUNC resolvers which always return the same function. On other targets, it requires to duplicate the dispatching logic found in libc inside libm. There could be a problem if the dispatching logic depends on the auxiliary vector passed by the kernel. libm will not have access to that during relocation. > if one updates libm.so will that also update math.h? I don't think that will be easy to support. > or we just want a libm with backward compatible abi? For now, yes. Thanks, Florian
On 06/08/2018 01:22 PM, Adhemerval Zanella wrote: > I think it should be a transitional configuration option with a plan to make it > default and later remove it once we have all bits upstream (maybe next release). > Which kind of fixes do you see it still requires to make it a default option? I didn't expect to make it the default because there is a size increase, and not all architectures will be able to support it. Thanks, Florian
On 08/06/2018 09:12, Florian Weimer wrote: > On 06/08/2018 01:22 PM, Adhemerval Zanella wrote: >> I think it should be a transitional configuration option with a plan to make it >> default and later remove it once we have all bits upstream (maybe next release). >> Which kind of fixes do you see it still requires to make it a default option? > > I didn't expect to make it the default because there is a size increase, and not all architectures will be able to support it. > > Thanks, > Florian My reservations about this change is adding another optional feature which requires an extra build to check and test. It also sets different expectations and semantics for different architecture, for instance someone might find this option does not work on his targeting architecture (this is different than libmvec which adds an extra option library).
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