This is the mail archive of the
mailing list for the binutils project.
Re: Preventing preemption of 'protected' symbols in GNU ld 2.26
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Alan Modra <amodra at gmail dot com>
- Cc: Cary Coutant <ccoutant at gmail dot com>, Joe Groff <jgroff at apple dot com>, Binutils <binutils at sourceware dot org>
- Date: Tue, 29 Mar 2016 08:44:29 -0700
- Subject: Re: Preventing preemption of 'protected' symbols in GNU ld 2.26
- Authentication-results: sourceware.org; auth=none
- References: <CAJimCsHGnHp+s4OXVMt5K=AOsz=nPqY_W7L_M0Ey5rSdK7nk1g at mail dot gmail dot com> <CAMe9rOowzNKqmgf+5A6R-BdEjv2_KAnEYO=PxUH6=MYST_Fu3w at mail dot gmail dot com> <9EFBBDCE-4054-4867-B3E9-9DFE216A234F at apple dot com> <CAMe9rOqqPVeaRZ8SPD-uoxRnHFOCGV3xXFNnDY5ez6xY8uG6hw at mail dot gmail dot com> <CAJimCsFffshMvsDoRq_33Ss8u9Y_Z4y2NKsqDbxJQuO6SyJNbg at mail dot gmail dot com> <CAMe9rOqcw2P_ZU2u-mQ5m7wrVygLKxD3R=KwkxdpiXkeM6o_2g at mail dot gmail dot com> <BC969B3B-87A2-4238-90C8-DA2E166707AF at apple dot com> <CAJimCsGW3qY2aow_WrjeXUUH9_XUWm5=kNp7DbqdgC_=G+jLuQ at mail dot gmail dot com> <08556ECF-C47B-400E-91A2-56D338E55D86 at apple dot com> <CAJimCsGDoYVWP4WLB-vu6Gr3Lnh0DoYYrWPZYgC3MKJ7Jv0oqQ at mail dot gmail dot com> <20160328232105 dot GA15812 at bubble dot grove dot modra dot org>
On Mon, Mar 28, 2016 at 4:21 PM, Alan Modra <firstname.lastname@example.org> 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.