From: "H.J. Lu" <hjl.tools@gmail.com>
To: Joe Groff <jgroff@apple.com>
Cc: Alan Modra <amodra@gmail.com>, Cary Coutant <ccoutant@gmail.com>,
Binutils <binutils@sourceware.org>
Subject: Re: Preventing preemption of 'protected' symbols in GNU ld 2.26
Date: Tue, 29 Mar 2016 19:43:00 -0000 [thread overview]
Message-ID: <CAMe9rOqTTwirymAY6ORp6D_GnCsMc_hYEdy1NbZpG6x5vQc5DQ@mail.gmail.com> (raw)
In-Reply-To: <983472E1-A1BC-4970-9CF9-0138A6BAD16D@apple.com>
On Tue, Mar 29, 2016 at 12:36 PM, Joe Groff <jgroff@apple.com> wrote:
>
>> On Mar 29, 2016, at 12:33 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>
>> On Tue, Mar 29, 2016 at 12:31 PM, Joe Groff <jgroff@apple.com> wrote:
>>> On Mar 29, 2016, at 8:44 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>>>
>>>> On Mon, Mar 28, 2016 at 4:21 PM, Alan Modra <amodra@gmail.com> wrote:
>>>>> On Mon, Mar 28, 2016 at 03:38:01PM -0700, Cary Coutant wrote:
>>>>>>>>> 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?
>>>>>>>>
>>>>>>>> There wouldn't be a measurable cost in dirty pages; the copied objects
>>>>>>>> are simply allocated in bss in the executable.
>>>>>>>
>>>>>>> Wouldn't references to the symbol from within the .so need to be relocated to reference the now-canonical copy in the executable?
>>>>>>
>>>>>> No, references from within the .so would have always used the GOT.
>>>>>> Non-protected global symbols in a shared library are still
>>>>>> pre-emptible, so they are always indirect, and there's always a
>>>>>> dynamic relocation for the GOT entry. Whether the prevailing
>>>>>> definition winds up in the executable or the shared library, the
>>>>>> dynamic loader still has to bind the symbol and apply the relocation.
>>>>>
>>>>> HJ's changes to protected visibility meant compiler changes so that
>>>>> protected visibility in shared libraries is no longer seen as local.
>>>>> So yes, protected visibility symbols in shared libraries now go
>>>>> through the GOT. Prior to his changes, they were optimized to a
>>>>> pc-relative access. Joe is correct in pointing out that shared
>>>>> libraries needed a change. Bad luck if you're using an older
>>>>> compiler. Also bad luck if you want to use protected visibility to
>>>>> optimize your shared library.
>>>>>
>>>>> HJ also made glibc ld.so changes to ensure the semantics of protected
>>>>> visibility symbols remain unchanged when multiple shared libraries
>>>>> define the same protected visibility symbol.
>>>>>
>>>>> Apparently most people in the gcc and glibc communities saw these
>>>>> toolchain modifications as fiendishly clever.
>>>>>
>>>>
>>>> As I said before, copy relocation and protected symbol are fundamentally
>>>> incompatible. Since copy relocation is the part of x86 psABIs, I updated
>>>> GCC, glibc and ld to make protected symbol to work with copy relocation.
>>>> That is protected symbol may be external, but won't be preempted. The
>>>> price I paid is that protected symbol won't be accessed via PC-relative
>>>> relocation within the shared object. To access protected symbol via
>>>> PC-relative relocation within the shared object, we need to disable copy
>>>> relocation in executable, which is a psABI change. That is why I proposed
>>>> to mark the object as such so that we won't get surprise at run-time.
>>>
>>> I think what Cary's arguing (and I honestly would expect) is that copying the protected symbol *is* for all intents and purposes a preemption. I'd expect copy relocations against protected symbols to be linker errors. I guess what's missing for gcc's intended optimization is an indication to the compiler that a symbol is protected in its home library, to suppress emitting PC-relative references to a copy relocation.
>>
>> That is what I meant by "That is why I proposed to mark the object as such so
>> that we won't get surprise at run-time."
>
> I don't see why it would be a runtime failure. ld could refuse to resolve the relocation at static link time, couldn't it?
>
The link-time shared library may be very different from the run-time
shared library. Since copy relocation works correctly against protected
symbol with the current gcc, binutils and glibc, we can't simply disallow
copy relocation against protected symbol at link-time. It should be done
with a link command-line as well as markers on the input files.
--
H.J.
next prev parent reply other threads:[~2016-03-29 19:43 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
[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 [this message]
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-04-15 21:49 ` Preventing preemption of 'protected' symbols in GNU ld 2.26 [aka should we revert the fix for 65248] Jeff Law
2016-04-15 21:56 ` H.J. Lu
2016-04-18 9:02 ` Richard Biener
2016-04-18 14:49 ` Alan Modra
2016-04-18 14:59 ` H.J. Lu
2016-04-18 17:04 ` Maciej W. Rozycki
2016-04-18 17:09 ` H.J. Lu
2016-04-18 17:24 ` Michael Matz
2016-04-18 17:27 ` H.J. Lu
2016-04-18 18:52 ` Jakub Jelinek
2016-04-18 19:28 ` H.J. Lu
2016-04-18 17:55 ` Cary Coutant
2016-04-25 17:24 ` Jeff Law
2016-04-25 17:31 ` H.J. Lu
2016-04-18 17:57 ` Maciej W. Rozycki
2016-04-19 5:08 ` Alan Modra
2016-04-19 8:20 ` Richard Biener
2016-04-19 9:53 ` Szabolcs Nagy
2016-04-19 14:06 ` Michael Matz
2016-04-19 15:37 ` Cary Coutant
2016-04-19 15:44 ` H.J. Lu
2016-04-19 15:52 ` H.J. Lu
2016-04-19 15:54 ` H.J. Lu
2016-04-19 15:58 ` Cary Coutant
2016-04-19 16:00 ` H.J. Lu
2016-04-19 15:54 ` Cary Coutant
2016-04-19 19:11 ` H.J. Lu
2016-04-19 20:17 ` Rich Felker
2016-04-19 21:03 ` Cary Coutant
2016-04-20 17:45 ` anonymous
2016-04-19 15:46 ` Alan Modra
2016-04-25 17:35 ` Jeff Law
2016-04-26 5:55 ` Alan Modra
2016-04-26 8:13 ` Jakub Jelinek
2016-04-18 17:05 ` Cary Coutant
2016-03-31 0:40 ` Preventing preemption of 'protected' symbols in GNU ld 2.26 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-19 19:47 ` Fwd: " Rich Felker
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
-- strict thread matches above, loose matches on Subject: below --
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
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
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=CAMe9rOqTTwirymAY6ORp6D_GnCsMc_hYEdy1NbZpG6x5vQc5DQ@mail.gmail.com \
--to=hjl.tools@gmail.com \
--cc=amodra@gmail.com \
--cc=binutils@sourceware.org \
--cc=ccoutant@gmail.com \
--cc=jgroff@apple.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).