From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by sourceware.org (Postfix) with ESMTPS id CC1A23858D3C for ; Fri, 10 Dec 2021 21:54:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org CC1A23858D3C Received: by mail-pj1-x1031.google.com with SMTP id k6-20020a17090a7f0600b001ad9d73b20bso8637332pjl.3 for ; Fri, 10 Dec 2021 13:54:42 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=arLmhqa5rjswlpfLdsJZBAarVnZHCKx3CLs8afmNmvI=; b=oTatXIExuOED85c5KPIuSctr8n650GtIdoatLAGIsYTPrPjaiH5/rtcVAz/6KARWls yItgpu3tiPuz505m2zdVbQg7cYtiTrALNajWZKrTvOxTVsXbsrOeVWoStT9L+CWsJlJr omEEZ7Rvhm/MEkzWDoj1H+J59qwZiNUkLm/OtBBly6AfGLuLOfMrqwi/eYUWbD8853y4 AWILGYLXtCiPbt/R9hS1ab0cP5Exp/YA5L+9Fct1d+8pmOduZ6fq752zT70CwH6ufBeR OetMcOUMskfNV3F58bbfclQJaF/S07I0SjdgDoiNvrhMF2S2e9eBKu0SWhdbS2xTCJEC klig== X-Gm-Message-State: AOAM5308OwlLmIyBwBTlw3uYccl4/ikP9eF9+cXDFU8ELEsaMDlRqeoC kDUWB3PtF6L91J2CgMK6aylCw8ImXkLURBhGGEATZSHzVOY= X-Google-Smtp-Source: ABdhPJwWl3uhQaLganQdzd5phZq8zvM9mLLv3N+A45uZXisrgbYriRWTEnysHUGTy6mwPXRDGEE9zwdWYoMjDn4W4SU= X-Received: by 2002:a17:90b:3a85:: with SMTP id om5mr27307337pjb.28.1639173281792; Fri, 10 Dec 2021 13:54:41 -0800 (PST) MIME-Version: 1.0 References: <20211210205922.2865613-1-hjl.tools@gmail.com> In-Reply-To: From: "H.J. Lu" Date: Fri, 10 Dec 2021 13:54:05 -0800 Message-ID: Subject: Re: [PATCH] Check alignment of PT_LOAD segment only if possible To: Adhemerval Zanella Cc: GNU C Library Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-3028.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Dec 2021 21:54:45 -0000 On Fri, Dec 10, 2021 at 1:36 PM Adhemerval Zanella 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 > > -- H.J.