public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Joe Groff <jgroff@apple.com>
To: "H.J. Lu" <hjl.tools@gmail.com>, Cary Coutant <ccoutant@gmail.com>
Cc: Binutils <binutils@sourceware.org>
Subject: Re: Preventing preemption of 'protected' symbols in GNU ld 2.26
Date: Mon, 28 Mar 2016 17:03:00 -0000	[thread overview]
Message-ID: <C3F55630-6DA4-45F5-8BE0-A30B733BC0F2@apple.com> (raw)
In-Reply-To: <BC969B3B-87A2-4238-90C8-DA2E166707AF@apple.com>


> On Mar 28, 2016, at 5:11 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> 
> On Thu, Mar 24, 2016 at 11:31 AM, Cary Coutant <ccoutant@gmail.com> wrote:
>>>>> What relocation do you propose to access external protected
>>>>> symbol on x86 for non-PIC code?
>>>> 
>>>> Non-PIC code can still use a GOT, can't it?
>>> 
>>> Yes.
>> 
>> Right.
>> 
>> Some additional thoughts:
>> 
>> - This has nothing to do with PIE. Non-PIC-non-PIE code has been
>> living with this restriction for at least 18 years (since visiblity
>> was introduced into the gABI).
>> 
>> - This has nothing to do with Ulrich's diatribe against protected
>> visibility, which applies only to function symbols (and really only to
>> one platform, due to how function pointer comparison works).
> 
> Copy relocation and protected symbol are mutually exclusive.
> Since copy relocation is the part of x86 psABIs, it limits
> protected symbol effectiveness on x86.  In glibc, we add a
> local alias to symbol we want to protect and access the local
> alias within glibc without GOT.

I had thought about doing this as a workaround for us, but if I understand correctly, this could result in two canonical copies of the object in the process's memory. For what we're using protected symbols for in Swift, we really want only one canonical object, and would prefer that protected references from the executable go through a GOT, similar to how references to external symbols always work in Mach-O.

>> - You don't need to go full-on PIC to reference a protected data
>> symbol in a shared library. You can always statically initialize a
>> pointer variable, and go indirect through that ("poor-man's PIC").
>> 
>> - We could add support for __attribute__((dllimport)) or
>> __declspec(dllimport) when declaring an external variable that is
>> expected to be defined in a shared library (ideally, that attribute
>> ought to be placed in the library's public interface). The compiler
>> can generate a PIC-style reference for that variable without
>> penalizing all the other variables in the main program. This is how
>> HP-UX compilers work on PA and Itanium (using #pragma external).
> 
> This is a useful feature, similar to -fno-plt, like -fgot, but only on
> selective symbols.

"protected" is already selective, though. The code generator had to intentionally set protected visibility on symbols.

> 
>> - Compilers could also generate tentative PIC-style references, with
>> sufficient relocations to allow the linker to convert the indirect
>> reference to a direct reference when possible (changing the second
>> load into a nop or copy). HP-UX also does this.
> 
> I extended the x86 psABIs with relaxable GOT relocations and
> implemented the similar linker optimization in ld in binutils 2.26
> and gold also implemented the subset of the linker optimization.
> 
>> - Indirect references from PIC code to a protected symbol penalize the
>> common case (referencing a symbol within its own module) to support
>> the uncommon case, while introducing the nasty side effects of a COPY
>> relocation.
>> 
>> - COPY relocations are evil. They bind an application to a specific
>> version of a shared library's ABI, and introduce a hidden startup
>> cost. If we're going to make any changes, we should be moving towards
>> elimination of COPY relocations, rather than disabling features that
>> were designed to improve performance.
> 
> Copy relocation can improve performance.  Google enabled copy
> relocations for PIE in ld/gold and GCC to improve prefomance by
> up to 5%:
> 
> https://gcc.gnu.org/ml/gcc-patches/2014-05/msg01215.html
> 
> It is in GCC 5.

Did you look at what the costs were in startup time and dirty pages by using copy relocations? What do you do if the size of the definition changes in a new version of the library?

-Joe

  parent reply	other threads:[~2016-03-28 17:03 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-24  0:00 Joe Groff
2016-03-24  0:45 ` H.J. Lu
2016-03-24  0:52   ` Joe Groff
2016-03-24  1:25     ` H.J. Lu
2016-03-24 15:01 ` Cary Coutant
2016-03-24 15:07   ` H.J. Lu
2016-03-24 16:06     ` Cary Coutant
2016-03-24 16:42       ` H.J. Lu
2016-03-24 16:56         ` Cary Coutant
2016-03-24 17:05           ` H.J. Lu
2016-03-24 17:06             ` Joe Groff
2016-03-24 17:09               ` H.J. Lu
2016-03-24 18:31                 ` Cary Coutant
2016-03-27 16:26                   ` Rafael Espíndola
2016-03-28 12:12                   ` H.J. Lu
     [not found]                     ` <BC969B3B-87A2-4238-90C8-DA2E166707AF@apple.com>
2016-03-28 17:03                       ` Joe Groff [this message]
2016-03-28 17:17                       ` H.J. Lu
2016-03-28 22:22                       ` Cary Coutant
2016-03-28 22:24                         ` Joe Groff
2016-03-28 22:38                           ` Cary Coutant
2016-03-28 22:41                             ` Joe Groff
2016-03-28 23:21                             ` Alan Modra
2016-03-29  0:29                               ` Cary Coutant
2016-03-29 15:44                               ` H.J. Lu
2016-03-28 22:12                     ` Cary Coutant
2016-03-29 12:40                   ` Maciej W. Rozycki
     [not found] <AB592ABD-D6D7-4D2F-A0D6-45738F168DC4@apple.com>
2016-03-29 19:31 ` Fwd: " Joe Groff
2016-03-29 19:33   ` H.J. Lu
2016-03-29 19:36     ` Joe Groff
2016-03-29 19:43       ` H.J. Lu
2016-03-29 19:51         ` Joe Groff
2016-03-29 19:54           ` H.J. Lu
2016-03-29 22:05             ` H.J. Lu
2016-03-30  1:44             ` Alan Modra
2016-03-30  1:46             ` Cary Coutant
2016-03-30  4:04               ` Jeff Law
2016-03-30  7:20                 ` Cary Coutant
2016-03-30  7:34                   ` Cary Coutant
2016-03-30 14:44                 ` Alan Modra
2016-03-31  0:45                   ` Cary Coutant
2016-03-31  0:40                 ` Cary Coutant
2016-03-31  0:53                   ` Jeff Law
2016-03-31 13:27                     ` Ramana Radhakrishnan
2016-03-31 15:05                       ` H.J. Lu
2016-04-15 16:10                       ` Szabolcs Nagy
2016-04-01 19:51                   ` Jeff Law
2016-04-02  2:53                     ` Alan Modra
2016-04-15 16:16 H.J. Lu
2016-04-15 16:36 ` Jeff Law
2016-04-15 16:45   ` H.J. Lu
2016-04-15 16:43 ` Szabolcs Nagy
2016-04-15 23:59   ` Maciej W. Rozycki
2016-04-16  1:08     ` Szabolcs Nagy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=C3F55630-6DA4-45F5-8BE0-A30B733BC0F2@apple.com \
    --to=jgroff@apple.com \
    --cc=binutils@sourceware.org \
    --cc=ccoutant@gmail.com \
    --cc=hjl.tools@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).