Check alignment of PT_LOAD segment only if possible

Message ID 20211210205922.2865613-1-hjl.tools@gmail.com
State Dropped
Headers
Series Check alignment of PT_LOAD segment only if possible |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent
dj/TryBot-32bit success Build for i686

Commit Message

H.J. Lu Dec. 10, 2021, 8:59 p.m. UTC
  Add a configure check for 2MB variable alignment and check alignment of
PT_LOAD segment only if 2MB variable alignment is supported.

Tested with cross build to glibcs-alpha-linux-gnu.
---
 configure    | 40 +++++++++++++++++++++++++++++++++++++++-
 configure.ac | 11 +++++++++++
 elf/Makefile | 15 ++++++++++-----
 3 files changed, 60 insertions(+), 6 deletions(-)
  

Comments

Adhemerval Zanella Netto Dec. 10, 2021, 9:36 p.m. UTC | #1
On 10/12/2021 17:59, H.J. Lu wrote:
> Add a configure check for 2MB variable alignment and check alignment of
> PT_LOAD segment only if 2MB variable alignment is supported.
> 
> Tested with cross build to glibcs-alpha-linux-gnu.
> ---
>  configure    | 40 +++++++++++++++++++++++++++++++++++++++-
>  configure.ac | 11 +++++++++++
>  elf/Makefile | 15 ++++++++++-----
>  3 files changed, 60 insertions(+), 6 deletions(-)
> 
> diff --git a/configure b/configure
> index e4d013907c..9da30f428f 100755
> --- a/configure
> +++ b/configure
> @@ -732,6 +732,7 @@ infodir
>  docdir
>  oldincludedir
>  includedir
> +runstatedir
>  localstatedir
>  sharedstatedir
>  sysconfdir
> @@ -845,6 +846,7 @@ datadir='${datarootdir}'
>  sysconfdir='${prefix}/etc'
>  sharedstatedir='${prefix}/com'
>  localstatedir='${prefix}/var'
> +runstatedir='${localstatedir}/run'
>  includedir='${prefix}/include'
>  oldincludedir='/usr/include'
>  docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
> @@ -1097,6 +1099,15 @@ do
>    | -silent | --silent | --silen | --sile | --sil)
>      silent=yes ;;
>  
> +  -runstatedir | --runstatedir | --runstatedi | --runstated \
> +  | --runstate | --runstat | --runsta | --runst | --runs \
> +  | --run | --ru | --r)
> +    ac_prev=runstatedir ;;
> +  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
> +  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
> +  | --run=* | --ru=* | --r=*)
> +    runstatedir=$ac_optarg ;;
> +
>    -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
>      ac_prev=sbindir ;;
>    -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \

Please use a non patched autoconf (usually debian based one adds the runstatedir).

> @@ -1234,7 +1245,7 @@ fi
>  for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
>  		datadir sysconfdir sharedstatedir localstatedir includedir \
>  		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
> -		libdir localedir mandir
> +		libdir localedir mandir runstatedir
>  do
>    eval ac_val=\$$ac_var
>    # Remove trailing slashes.
> @@ -1387,6 +1398,7 @@ Fine tuning of the installation directories:
>    --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
>    --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
>    --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
> +  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
>    --libdir=DIR            object code libraries [EPREFIX/lib]
>    --includedir=DIR        C header files [PREFIX/include]
>    --oldincludedir=DIR     C header files for non-gcc [/usr/include]
> @@ -6817,6 +6829,32 @@ if test $libc_cv_builtin_trap = yes; then
>  
>  fi
>  
> +# Check target support for 2MB variable alignment.
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 2MB variable alignment" >&5
> +$as_echo_n "checking for 2MB variable alignment... " >&6; }
> +if ${libc_cv_have_2MB_alignment+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +
> +cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h.  */
> +
> +int foo __attribute__((aligned(0x200000))) = 1;
> +
> +_ACEOF
> +if ac_fn_c_try_compile "$LINENO"; then :
> +  libc_cv_have_2MB_alignment=yes
> +else
> +  libc_cv_have_2MB_alignment=no
> +fi
> +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> +
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_2MB_alignment" >&5
> +$as_echo "$libc_cv_have_2MB_alignment" >&6; }
> +config_vars="$config_vars
> +have-2MB-alignment = $libc_cv_have_2MB_alignment"
> +
>  ac_ext=cpp
>  ac_cpp='$CXXCPP $CPPFLAGS'
>  ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
> diff --git a/configure.ac b/configure.ac
> index a91a7f399c..57d4572c26 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1726,6 +1726,17 @@ if test $libc_cv_builtin_trap = yes; then
>    AC_DEFINE([HAVE_BUILTIN_TRAP])
>  fi
>  
> +# Check target support for 2MB variable alignment.
> +AC_CACHE_CHECK([for 2MB variable alignment],
> +	       libc_cv_have_2MB_alignment, [
> +AC_COMPILE_IFELSE([AC_LANG_SOURCE([
> +int foo __attribute__((aligned(0x200000))) = 1;
> +])],
> +	       [libc_cv_have_2MB_alignment=yes],
> +	       [libc_cv_have_2MB_alignment=no])
> +])
> +LIBC_CONFIG_VAR([have-2MB-alignment], [$libc_cv_have_2MB_alignment])
> +
>  dnl C++ feature tests.
>  AC_LANG_PUSH([C++])
>  

Would be better to check 2 times the maximum supported pagesize instead?

> diff --git a/elf/Makefile b/elf/Makefile
> index fe42caeb0e..1bf77bc5ac 100644
> --- a/elf/Makefile
> +++ b/elf/Makefile
> @@ -207,7 +207,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
>  	 tst-tls4 tst-tls5 \
>  	 tst-tls10 tst-tls11 tst-tls12 tst-tls13 tst-tls14 tst-tls15 \
>  	 tst-tls16 tst-tls17 tst-tls18 tst-tls19 tst-tls-dlinfo \
> -	 tst-align tst-align2 tst-align3 \
> +	 tst-align tst-align2 \
>  	 tst-dlmodcount tst-dlopenrpath tst-deep1 \
>  	 tst-dlmopen1 tst-dlmopen3 tst-dlmopen4 \
>  	 unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \
> @@ -241,9 +241,6 @@ tests-internal += loadtest unload unload2 circleload1 \
>  tests-container += tst-pldd tst-dlopen-tlsmodid-container \
>    tst-dlopen-self-container tst-preload-pthread-libc
>  test-srcs = tst-pathopt
> -ifeq (yes,$(have-fpie))
> -tests-pie += tst-align3
> -endif
>  selinux-enabled := $(shell cat /selinux/enforce 2> /dev/null)
>  ifneq ($(selinux-enabled),1)
>  tests-execstack-yes = tst-execstack tst-execstack-needed tst-execstack-prog
> @@ -305,7 +302,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
>  		circlemod3 circlemod3a \
>  		reldep8mod1 reldep8mod2 reldep8mod3 \
>  		reldep9mod1 reldep9mod2 reldep9mod3 \
> -		tst-alignmod tst-alignmod2 tst-alignmod3 \
> +		tst-alignmod tst-alignmod2 \
>  		$(modules-execstack-$(have-z-execstack)) \
>  		tst-dlopenrpathmod tst-deep1mod1 tst-deep1mod2 tst-deep1mod3 \
>  		tst-dlmopen1mod tst-auditmod1 \
> @@ -418,6 +415,14 @@ endif
>  modules-execstack-yes = tst-execstack-mod
>  extra-test-objs += $(addsuffix .os,$(strip $(modules-names)))
>  
> +ifeq (yes,$(have-2MB-alignment))
> +tests += tst-align3
> +modules-names += tst-alignmod3
> +ifeq (yes,$(have-fpie))
> +tests-pie += tst-align3
> +endif
> +endif
> +
>  # filtmod1.so, tst-big-note-lib.so, tst-ro-dynamic-mod.so have special
>  # rules.
>  modules-names-nobuild := filtmod1 tst-big-note-lib tst-ro-dynamic-mod
>
  
H.J. Lu Dec. 10, 2021, 9:54 p.m. UTC | #2
On Fri, Dec 10, 2021 at 1:36 PM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
>
>
> On 10/12/2021 17:59, H.J. Lu wrote:
> > Add a configure check for 2MB variable alignment and check alignment of
> > PT_LOAD segment only if 2MB variable alignment is supported.
> >
> > Tested with cross build to glibcs-alpha-linux-gnu.
> > ---
> >  configure    | 40 +++++++++++++++++++++++++++++++++++++++-
> >  configure.ac | 11 +++++++++++
> >  elf/Makefile | 15 ++++++++++-----
> >  3 files changed, 60 insertions(+), 6 deletions(-)
> >
> > diff --git a/configure b/configure
> > index e4d013907c..9da30f428f 100755
> > --- a/configure
> > +++ b/configure
> > @@ -732,6 +732,7 @@ infodir
> >  docdir
> >  oldincludedir
> >  includedir
> > +runstatedir
> >  localstatedir
> >  sharedstatedir
> >  sysconfdir
> > @@ -845,6 +846,7 @@ datadir='${datarootdir}'
> >  sysconfdir='${prefix}/etc'
> >  sharedstatedir='${prefix}/com'
> >  localstatedir='${prefix}/var'
> > +runstatedir='${localstatedir}/run'
> >  includedir='${prefix}/include'
> >  oldincludedir='/usr/include'
> >  docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
> > @@ -1097,6 +1099,15 @@ do
> >    | -silent | --silent | --silen | --sile | --sil)
> >      silent=yes ;;
> >
> > +  -runstatedir | --runstatedir | --runstatedi | --runstated \
> > +  | --runstate | --runstat | --runsta | --runst | --runs \
> > +  | --run | --ru | --r)
> > +    ac_prev=runstatedir ;;
> > +  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
> > +  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
> > +  | --run=* | --ru=* | --r=*)
> > +    runstatedir=$ac_optarg ;;
> > +
> >    -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
> >      ac_prev=sbindir ;;
> >    -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
>
> Please use a non patched autoconf (usually debian based one adds the runstatedir).

Fixed.

> > @@ -1234,7 +1245,7 @@ fi
> >  for ac_var in        exec_prefix prefix bindir sbindir libexecdir datarootdir \
> >               datadir sysconfdir sharedstatedir localstatedir includedir \
> >               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
> > -             libdir localedir mandir
> > +             libdir localedir mandir runstatedir
> >  do
> >    eval ac_val=\$$ac_var
> >    # Remove trailing slashes.
> > @@ -1387,6 +1398,7 @@ Fine tuning of the installation directories:
> >    --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
> >    --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
> >    --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
> > +  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
> >    --libdir=DIR            object code libraries [EPREFIX/lib]
> >    --includedir=DIR        C header files [PREFIX/include]
> >    --oldincludedir=DIR     C header files for non-gcc [/usr/include]
> > @@ -6817,6 +6829,32 @@ if test $libc_cv_builtin_trap = yes; then
> >
> >  fi
> >
> > +# Check target support for 2MB variable alignment.
> > +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 2MB variable alignment" >&5
> > +$as_echo_n "checking for 2MB variable alignment... " >&6; }
> > +if ${libc_cv_have_2MB_alignment+:} false; then :
> > +  $as_echo_n "(cached) " >&6
> > +else
> > +
> > +cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> > +/* end confdefs.h.  */
> > +
> > +int foo __attribute__((aligned(0x200000))) = 1;
> > +
> > +_ACEOF
> > +if ac_fn_c_try_compile "$LINENO"; then :
> > +  libc_cv_have_2MB_alignment=yes
> > +else
> > +  libc_cv_have_2MB_alignment=no
> > +fi
> > +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> > +
> > +fi
> > +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_2MB_alignment" >&5
> > +$as_echo "$libc_cv_have_2MB_alignment" >&6; }
> > +config_vars="$config_vars
> > +have-2MB-alignment = $libc_cv_have_2MB_alignment"
> > +
> >  ac_ext=cpp
> >  ac_cpp='$CXXCPP $CPPFLAGS'
> >  ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
> > diff --git a/configure.ac b/configure.ac
> > index a91a7f399c..57d4572c26 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -1726,6 +1726,17 @@ if test $libc_cv_builtin_trap = yes; then
> >    AC_DEFINE([HAVE_BUILTIN_TRAP])
> >  fi
> >
> > +# Check target support for 2MB variable alignment.
> > +AC_CACHE_CHECK([for 2MB variable alignment],
> > +            libc_cv_have_2MB_alignment, [
> > +AC_COMPILE_IFELSE([AC_LANG_SOURCE([
> > +int foo __attribute__((aligned(0x200000))) = 1;
> > +])],
> > +            [libc_cv_have_2MB_alignment=yes],
> > +            [libc_cv_have_2MB_alignment=no])
> > +])
> > +LIBC_CONFIG_VAR([have-2MB-alignment], [$libc_cv_have_2MB_alignment])
> > +
> >  dnl C++ feature tests.
> >  AC_LANG_PUSH([C++])
> >
>
> Would be better to check 2 times the maximum supported pagesize instead?

Why 2 times?  The test only uses 2MB alignment.  The implementation
self doesn't depend on the maximum supported page size.   The limit
is available free address space.

> > diff --git a/elf/Makefile b/elf/Makefile
> > index fe42caeb0e..1bf77bc5ac 100644
> > --- a/elf/Makefile
> > +++ b/elf/Makefile
> > @@ -207,7 +207,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
> >        tst-tls4 tst-tls5 \
> >        tst-tls10 tst-tls11 tst-tls12 tst-tls13 tst-tls14 tst-tls15 \
> >        tst-tls16 tst-tls17 tst-tls18 tst-tls19 tst-tls-dlinfo \
> > -      tst-align tst-align2 tst-align3 \
> > +      tst-align tst-align2 \
> >        tst-dlmodcount tst-dlopenrpath tst-deep1 \
> >        tst-dlmopen1 tst-dlmopen3 tst-dlmopen4 \
> >        unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \
> > @@ -241,9 +241,6 @@ tests-internal += loadtest unload unload2 circleload1 \
> >  tests-container += tst-pldd tst-dlopen-tlsmodid-container \
> >    tst-dlopen-self-container tst-preload-pthread-libc
> >  test-srcs = tst-pathopt
> > -ifeq (yes,$(have-fpie))
> > -tests-pie += tst-align3
> > -endif
> >  selinux-enabled := $(shell cat /selinux/enforce 2> /dev/null)
> >  ifneq ($(selinux-enabled),1)
> >  tests-execstack-yes = tst-execstack tst-execstack-needed tst-execstack-prog
> > @@ -305,7 +302,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
> >               circlemod3 circlemod3a \
> >               reldep8mod1 reldep8mod2 reldep8mod3 \
> >               reldep9mod1 reldep9mod2 reldep9mod3 \
> > -             tst-alignmod tst-alignmod2 tst-alignmod3 \
> > +             tst-alignmod tst-alignmod2 \
> >               $(modules-execstack-$(have-z-execstack)) \
> >               tst-dlopenrpathmod tst-deep1mod1 tst-deep1mod2 tst-deep1mod3 \
> >               tst-dlmopen1mod tst-auditmod1 \
> > @@ -418,6 +415,14 @@ endif
> >  modules-execstack-yes = tst-execstack-mod
> >  extra-test-objs += $(addsuffix .os,$(strip $(modules-names)))
> >
> > +ifeq (yes,$(have-2MB-alignment))
> > +tests += tst-align3
> > +modules-names += tst-alignmod3
> > +ifeq (yes,$(have-fpie))
> > +tests-pie += tst-align3
> > +endif
> > +endif
> > +
> >  # filtmod1.so, tst-big-note-lib.so, tst-ro-dynamic-mod.so have special
> >  # rules.
> >  modules-names-nobuild := filtmod1 tst-big-note-lib tst-ro-dynamic-mod
> >
  
Adhemerval Zanella Netto Dec. 10, 2021, 10:50 p.m. UTC | #3
On 10/12/2021 18:54, H.J. Lu wrote:
> On Fri, Dec 10, 2021 at 1:36 PM Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>>
>>
>>
>> On 10/12/2021 17:59, H.J. Lu wrote:
>>> Add a configure check for 2MB variable alignment and check alignment of
>>> PT_LOAD segment only if 2MB variable alignment is supported.
>>>
>>> Tested with cross build to glibcs-alpha-linux-gnu.
>>> ---
>>>  configure    | 40 +++++++++++++++++++++++++++++++++++++++-
>>>  configure.ac | 11 +++++++++++
>>>  elf/Makefile | 15 ++++++++++-----
>>>  3 files changed, 60 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/configure b/configure
>>> index e4d013907c..9da30f428f 100755
>>> --- a/configure
>>> +++ b/configure
>>> @@ -732,6 +732,7 @@ infodir
>>>  docdir
>>>  oldincludedir
>>>  includedir
>>> +runstatedir
>>>  localstatedir
>>>  sharedstatedir
>>>  sysconfdir
>>> @@ -845,6 +846,7 @@ datadir='${datarootdir}'
>>>  sysconfdir='${prefix}/etc'
>>>  sharedstatedir='${prefix}/com'
>>>  localstatedir='${prefix}/var'
>>> +runstatedir='${localstatedir}/run'
>>>  includedir='${prefix}/include'
>>>  oldincludedir='/usr/include'
>>>  docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
>>> @@ -1097,6 +1099,15 @@ do
>>>    | -silent | --silent | --silen | --sile | --sil)
>>>      silent=yes ;;
>>>
>>> +  -runstatedir | --runstatedir | --runstatedi | --runstated \
>>> +  | --runstate | --runstat | --runsta | --runst | --runs \
>>> +  | --run | --ru | --r)
>>> +    ac_prev=runstatedir ;;
>>> +  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
>>> +  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
>>> +  | --run=* | --ru=* | --r=*)
>>> +    runstatedir=$ac_optarg ;;
>>> +
>>>    -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
>>>      ac_prev=sbindir ;;
>>>    -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
>>
>> Please use a non patched autoconf (usually debian based one adds the runstatedir).
> 
> Fixed.
> 
>>> @@ -1234,7 +1245,7 @@ fi
>>>  for ac_var in        exec_prefix prefix bindir sbindir libexecdir datarootdir \
>>>               datadir sysconfdir sharedstatedir localstatedir includedir \
>>>               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
>>> -             libdir localedir mandir
>>> +             libdir localedir mandir runstatedir
>>>  do
>>>    eval ac_val=\$$ac_var
>>>    # Remove trailing slashes.
>>> @@ -1387,6 +1398,7 @@ Fine tuning of the installation directories:
>>>    --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
>>>    --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
>>>    --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
>>> +  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
>>>    --libdir=DIR            object code libraries [EPREFIX/lib]
>>>    --includedir=DIR        C header files [PREFIX/include]
>>>    --oldincludedir=DIR     C header files for non-gcc [/usr/include]
>>> @@ -6817,6 +6829,32 @@ if test $libc_cv_builtin_trap = yes; then
>>>
>>>  fi
>>>
>>> +# Check target support for 2MB variable alignment.
>>> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 2MB variable alignment" >&5
>>> +$as_echo_n "checking for 2MB variable alignment... " >&6; }
>>> +if ${libc_cv_have_2MB_alignment+:} false; then :
>>> +  $as_echo_n "(cached) " >&6
>>> +else
>>> +
>>> +cat confdefs.h - <<_ACEOF >conftest.$ac_ext
>>> +/* end confdefs.h.  */
>>> +
>>> +int foo __attribute__((aligned(0x200000))) = 1;
>>> +
>>> +_ACEOF
>>> +if ac_fn_c_try_compile "$LINENO"; then :
>>> +  libc_cv_have_2MB_alignment=yes
>>> +else
>>> +  libc_cv_have_2MB_alignment=no
>>> +fi
>>> +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
>>> +
>>> +fi
>>> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_2MB_alignment" >&5
>>> +$as_echo "$libc_cv_have_2MB_alignment" >&6; }
>>> +config_vars="$config_vars
>>> +have-2MB-alignment = $libc_cv_have_2MB_alignment"
>>> +
>>>  ac_ext=cpp
>>>  ac_cpp='$CXXCPP $CPPFLAGS'
>>>  ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
>>> diff --git a/configure.ac b/configure.ac
>>> index a91a7f399c..57d4572c26 100644
>>> --- a/configure.ac
>>> +++ b/configure.ac
>>> @@ -1726,6 +1726,17 @@ if test $libc_cv_builtin_trap = yes; then
>>>    AC_DEFINE([HAVE_BUILTIN_TRAP])
>>>  fi
>>>
>>> +# Check target support for 2MB variable alignment.
>>> +AC_CACHE_CHECK([for 2MB variable alignment],
>>> +            libc_cv_have_2MB_alignment, [
>>> +AC_COMPILE_IFELSE([AC_LANG_SOURCE([
>>> +int foo __attribute__((aligned(0x200000))) = 1;
>>> +])],
>>> +            [libc_cv_have_2MB_alignment=yes],
>>> +            [libc_cv_have_2MB_alignment=no])
>>> +])
>>> +LIBC_CONFIG_VAR([have-2MB-alignment], [$libc_cv_have_2MB_alignment])
>>> +
>>>  dnl C++ feature tests.
>>>  AC_LANG_PUSH([C++])
>>>
>>
>> Would be better to check 2 times the maximum supported pagesize instead?
> 
> Why 2 times?  The test only uses 2MB alignment.  The implementation
> self doesn't depend on the maximum supported page size.   The limit
> is available free address space.

It is an arbitrary value larger than the pagesize to make the test check
for it even on architecture that do no support 2MB alignment.
  

Patch

diff --git a/configure b/configure
index e4d013907c..9da30f428f 100755
--- a/configure
+++ b/configure
@@ -732,6 +732,7 @@  infodir
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -845,6 +846,7 @@  datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1097,6 +1099,15 @@  do
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1234,7 +1245,7 @@  fi
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
+		libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1387,6 +1398,7 @@  Fine tuning of the installation directories:
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -6817,6 +6829,32 @@  if test $libc_cv_builtin_trap = yes; then
 
 fi
 
+# Check target support for 2MB variable alignment.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 2MB variable alignment" >&5
+$as_echo_n "checking for 2MB variable alignment... " >&6; }
+if ${libc_cv_have_2MB_alignment+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int foo __attribute__((aligned(0x200000))) = 1;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  libc_cv_have_2MB_alignment=yes
+else
+  libc_cv_have_2MB_alignment=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_have_2MB_alignment" >&5
+$as_echo "$libc_cv_have_2MB_alignment" >&6; }
+config_vars="$config_vars
+have-2MB-alignment = $libc_cv_have_2MB_alignment"
+
 ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
diff --git a/configure.ac b/configure.ac
index a91a7f399c..57d4572c26 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1726,6 +1726,17 @@  if test $libc_cv_builtin_trap = yes; then
   AC_DEFINE([HAVE_BUILTIN_TRAP])
 fi
 
+# Check target support for 2MB variable alignment.
+AC_CACHE_CHECK([for 2MB variable alignment],
+	       libc_cv_have_2MB_alignment, [
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+int foo __attribute__((aligned(0x200000))) = 1;
+])],
+	       [libc_cv_have_2MB_alignment=yes],
+	       [libc_cv_have_2MB_alignment=no])
+])
+LIBC_CONFIG_VAR([have-2MB-alignment], [$libc_cv_have_2MB_alignment])
+
 dnl C++ feature tests.
 AC_LANG_PUSH([C++])
 
diff --git a/elf/Makefile b/elf/Makefile
index fe42caeb0e..1bf77bc5ac 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -207,7 +207,7 @@  tests += restest1 preloadtest loadfail multiload origtest resolvfail \
 	 tst-tls4 tst-tls5 \
 	 tst-tls10 tst-tls11 tst-tls12 tst-tls13 tst-tls14 tst-tls15 \
 	 tst-tls16 tst-tls17 tst-tls18 tst-tls19 tst-tls-dlinfo \
-	 tst-align tst-align2 tst-align3 \
+	 tst-align tst-align2 \
 	 tst-dlmodcount tst-dlopenrpath tst-deep1 \
 	 tst-dlmopen1 tst-dlmopen3 tst-dlmopen4 \
 	 unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \
@@ -241,9 +241,6 @@  tests-internal += loadtest unload unload2 circleload1 \
 tests-container += tst-pldd tst-dlopen-tlsmodid-container \
   tst-dlopen-self-container tst-preload-pthread-libc
 test-srcs = tst-pathopt
-ifeq (yes,$(have-fpie))
-tests-pie += tst-align3
-endif
 selinux-enabled := $(shell cat /selinux/enforce 2> /dev/null)
 ifneq ($(selinux-enabled),1)
 tests-execstack-yes = tst-execstack tst-execstack-needed tst-execstack-prog
@@ -305,7 +302,7 @@  modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
 		circlemod3 circlemod3a \
 		reldep8mod1 reldep8mod2 reldep8mod3 \
 		reldep9mod1 reldep9mod2 reldep9mod3 \
-		tst-alignmod tst-alignmod2 tst-alignmod3 \
+		tst-alignmod tst-alignmod2 \
 		$(modules-execstack-$(have-z-execstack)) \
 		tst-dlopenrpathmod tst-deep1mod1 tst-deep1mod2 tst-deep1mod3 \
 		tst-dlmopen1mod tst-auditmod1 \
@@ -418,6 +415,14 @@  endif
 modules-execstack-yes = tst-execstack-mod
 extra-test-objs += $(addsuffix .os,$(strip $(modules-names)))
 
+ifeq (yes,$(have-2MB-alignment))
+tests += tst-align3
+modules-names += tst-alignmod3
+ifeq (yes,$(have-fpie))
+tests-pie += tst-align3
+endif
+endif
+
 # filtmod1.so, tst-big-note-lib.so, tst-ro-dynamic-mod.so have special
 # rules.
 modules-names-nobuild := filtmod1 tst-big-note-lib tst-ro-dynamic-mod