From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-yb1-xb29.google.com (mail-yb1-xb29.google.com [IPv6:2607:f8b0:4864:20::b29]) by sourceware.org (Postfix) with ESMTPS id B886A3852C48 for ; Thu, 17 Nov 2022 21:46:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B886A3852C48 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=google.com Received: by mail-yb1-xb29.google.com with SMTP id 7so3483206ybp.13 for ; Thu, 17 Nov 2022 13:46:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=0P+KN84xC2c0QNqDdjJdoOsxeC88QsGuslD8FK1ApwE=; b=DFJhU3bzcGkN39DJUEdNhi4245CR2vSMsQyG1pX+xoGboX/3yUx3bYfNzAQnl/YdxO YlRQLQdLTZgl0vt0eBOWOM11m0Talb8nYZONyaZfRr4M0YcEYYlVP9SVF8YgFC/SDcX2 l18ZV78a+UCOMpHHcpvP9hDOXIFcs2aupJODllxJJo/QmIoi+ThJjDMvxYJeA5kqsGcA TplfenYbKXYv/OC85lTmUACfeXFjU/Epyzxm2IW0hml5cQCgiFZw0YygUeSVM+d5Fz3z MahbTJSSp0lDLniYt2UdG/FB63y/JHBJBFi35TJlbayxHqRMdzHJPbqSdiGzDx4Y8qFY MU+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0P+KN84xC2c0QNqDdjJdoOsxeC88QsGuslD8FK1ApwE=; b=O4+hgG2Se0q1e3wMTmUoxfDWhPX3CGVUnv/okh/8zyElaCImhAgHS5G81j5fJZjAYX r/4MsBnDQ5LCH1GeY4KdrCvSUzj+pOAxbPWGiKRdcpLNvyU8AMv9kEhqUPZvDX9hrvVe XllRdHmR2TRuV5FWMl2pv4snflYIUScMDTqEGM+B9A/GgRCWOqhR+zek5itqmFZhKMI3 ldcUuN9YTRNLswHQtNZ2eWHTiEJ5D2hhU2TEI4yOqosdsdd2uhnKBv+OeFbgppw01vCy P2FEZrviDF21ISaaXWqMDv458L8jFk3bANFgYbk04sn63YM/9DhFyI2f44Qyf2vo1iQg jNjg== X-Gm-Message-State: ANoB5pm3FiQ+4kgsqTKTWSBfEIs/3pKNxGam5Esy7Pg3u2cqDOrvEwx9 i902fAbY+fEAzpjwHoSIdLTgzR9q3souEjH07QlKgw== X-Google-Smtp-Source: AA0mqf7SJoz7aCfDgaIf8hP5obx5v9fjyifBdRCZYKWldYENhnpVDIMeZOJsyvIHJFPrZZwUzkvDeR2XbHJVWplBmpw= X-Received: by 2002:a5b:749:0:b0:6ca:2ed3:bff2 with SMTP id s9-20020a5b0749000000b006ca2ed3bff2mr3827207ybq.101.1668721586857; Thu, 17 Nov 2022 13:46:26 -0800 (PST) MIME-Version: 1.0 References: <20221117212006.dspm45znjyqj6ktf@google.com> In-Reply-To: From: Fangrui Song Date: Thu, 17 Nov 2022 13:46:15 -0800 Message-ID: Subject: Re: [PATCH] AArch64: Add support for -mdirect-extern-access To: Andrew Pinski Cc: Wilco Dijkstra , Richard Sandiford , Ramana Radhakrishnan , GCC Patches , Kyrylo Tkachov Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-16.6 required=5.0 tests=BAYES_00,BODY_8BITS,DKIMWL_WL_MED,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,ENV_AND_HDR_SPF_MATCH,KAM_INFOUSMEBIZ,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,USER_IN_DEF_DKIM_WL,USER_IN_DEF_SPF_WL autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On Thu, Nov 17, 2022 at 1:37 PM Andrew Pinski wrote: > > On Thu, Nov 17, 2022 at 1:21 PM maskray--- via Gcc-patches > wrote: > > > > > +.. option:: -mdirect-extern-access, -mno-direct-extern-access > > > + > > > + Use direct accesses for external data symbols. It avoids a GOT in= direction > > > + on all external data symbols with :option:`-fpie` or :option:`-fPI= E`. This is > > > + useful for executables linked with :option:`-static` or :option:`-= static-pie`. > > > + With :option:`-fpic` or :option:`-fPIC`, it only affects accesses = to protected > > > + data symbols. It has no effect on non-position independent code. = The default > > > + is :option:`-mno-direct-extern-access`. > > > + > > > + .. warning:: > > > + > > > + Use :option:`-mdirect-extern-access` either in shared libraries = or in > > > + executables, but not in both. Protected symbols used both in a = shared > > > + library and executable may cause linker errors or fail to work c= orrectly. > > > > I think current GCC and Clang's behavior is: > > > > * -mdirect-extern-access is the default for -fno-pic. This is to enable= optimizations for -static programs but may introduce copy relocations. > > * -mno-direct-extern-access is the default for -fpie and -fpic. This us= es some GOT-generating relocations which can be optimized out (lld, see htt= ps://maskray.me/blog/2021-08-29-all-about-global-offset-table) but the inst= ruction is nevertheless slightly longer. > > > > (-mdirect-extern-access for -fpic probably doesn't make sense.) > > > > The option I introduced to Clang is -fdirect-access-external-data > > (see https://maskray.me/blog/2021-01-09-copy-relocations-canonical-plt-= entries-and-protected). > > If -mdirect-extern-access gets more popular, I can add a Clang alias. > > But I am opposed to forcing a GNU property for -mdirect-extern-access/-= mno-direct-extern-access. > > > > FWIW I used https://gist.github.com/MaskRay/c03a90922003df666551589f162= 9df22 to test my Clang changes related to -fno-semantic-interposition > > on various visibility attributes x non-weak/weak x nopic/pie/pic x dlli= mport/not x ... > > > The x86_64 discussion about this is here > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D98112 . > I think clang changing the ABI is just broken and should think twice > before we do it for GCC. > > And there is a lot of visibility protected issues filed in GCC bug > databases specifically about copy relocs too. > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D56527 > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D37611 > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D19520 > https://sourceware.org/bugzilla/show_bug.cgi?id=3D28875 > https://sourceware.org/bugzilla/show_bug.cgi?id=3D28877 > I also suspect clang's behavior is still broken too. > > Thanks, > Andrew Well, I don't think Clang changed ABI regarding -fno-pic/-fpie/-fpic. As I did archaeology on https://maskray.me/blog/2021-01-09-copy-relocations-canonical-plt-entries-a= nd-protected "Reflection on protected data symbols and copy relocations" GCC 5 x86-64 made a change and GCC aarch64 accidentally picked up the chang= e. """ On the GCC side, in -fpic mode, using GOT-generating relocations when accessing a protected variable subverts the point using the protected visibility. The unneeded pessimization is the foremost complaint. The pessimization applies to all ports with #define TARGET_BINDS_LOCAL_P default_binds_local_p_2. aarch64 moved to default_binds_local_p_2 accidentally by https://gcc.gnu.org/git/?p=3Dgcc.git;a=3Dcommit;h=3Dcbddf64c0243816b45e6680= 754a251c603245dbc. For GCC<5 (and all versions of Clang), direct accesses to protected variables are produced in -fpic code. Mixing such object files can still silently break copy relocations on protected data symbols. Therefore, GNU ld made the controversial change https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;a=3Dcommit;h=3Dc= a3fe95e469b9daec153caa2c90665f5daaec2b5 to error in -shared mode. """ > > > > On 2022-11-17, Ramana Radhakrishnan wrote: > > >On Thu, Nov 17, 2022 at 5:30 PM Richard Sandiford via Gcc-patches > > > wrote: > > >> > > >> Wilco Dijkstra writes: > > >> > Hi Richard, > > >> > > > >> >> Can you go into more detail about: > > >> >> > > >> >> Use :option:`-mdirect-extern-access` either in shared librarie= s or in > > >> >> executables, but not in both. Protected symbols used both in = a shared > > >> >> library and executable may cause linker errors or fail to work= correctly > > >> >> > > >> >> If this is LLVM's default for PIC (and by assumption shared libra= ries), > > >> >> is it then invalid to use -mdirect-extern-access for any PIEs tha= t > > >> >> are linked against those shared libraries and use protected symbo= ls > > >> >> from those libraries? How would a user know that one of the shar= ed > > >> >> libraries they're linking against was built in this way? > > >> > > > >> > Yes, the usage model is that you'd either use it for static PIE or= only on > > >> > data that is not shared. If you get it wrong them you'll get the c= opy > > >> > relocation error. > > >> > > >> Thanks. I think I'm still missing something though. If, for the > > >> non-executable case, people should only use the feature on data that > > >> is not shared, why do we need to relax the binds-local condition for > > >> protected symbols on -fPIC? Oughtn't the symbol to be hidden rather > > >> than protected if the data isn't shared? > > >> > > >> I can understand the reasoning for the PIE changes but I'm still > > >> struggling with the PIC-but-not-PIE bits. > > > > > >I think I'm with Richard S on hidden vs protected on first reading. I > > >can see why this works out of the box and can even be default for > > >static-pie. > > > > > >Any reason why this is not on by default - it's early enough in the > > >stage3 cycle and we can always flip the defaults if there are more > > >problems found. > > > > > >You probably need a rebase for the documentation bits,. > > > > > >regards > > >Ramana > > > > > > > > >Ramana > > > > > > + is :option:`-mno-direct-extern-access`. --=20 =E5=AE=8B=E6=96=B9=E7=9D=BF