This is the mail archive of the
mailing list for the glibc project.
Re: [PATCH] Remove unnecessary IFUNC dispatch for __memset_chk.
- From: Alexander Monakov <amonakov at ispras dot ru>
- To: Zack Weinberg <zackw at panix dot com>
- Cc: Ondřej Bílka <neleai at seznam dot cz>, "H.J. Lu" <hjl dot tools at gmail dot com>, Andreas Schwab <schwab at linux-m68k dot org>, GNU C Library <libc-alpha at sourceware dot org>
- Date: Tue, 11 Aug 2015 12:59:33 +0300 (MSK)
- Subject: Re: [PATCH] Remove unnecessary IFUNC dispatch for __memset_chk.
- Authentication-results: sourceware.org; auth=none
- References: <20150809013434 dot 0B16814B9A at panix1 dot panix dot com> <m28u9lotfk dot fsf at linux-m68k dot org> <55C76FCD dot 5020607 at panix dot com> <CAMe9rOoAWjRma_mG_FazVh3FGOyiGJ=g82=bsfGqa-COnt5p1g at mail dot gmail dot com> <55C78525 dot 40402 at panix dot com> <CAMe9rOrKg8nzB67+OCXz5n1u7ZLnJncpX7J6KkEXqe0Bra843w at mail dot gmail dot com> <55C79AD8 dot 3070301 at panix dot com> <20150810030920 dot GE23550 at vapier> <20150810211200 dot GA17734 at domone> <CAKCAbMia4RCA7X0YHYeXC6eAGCxzDqhWrMiGS4NxA-cDxFioVw at mail dot gmail dot com>
On Mon, 10 Aug 2015, Zack Weinberg wrote:
> On Mon, Aug 10, 2015 at 5:12 PM, OndÅej BÃlka <email@example.com> wrote:
> > On Sun, Aug 09, 2015 at 11:09:20PM -0400, Mike Frysinger wrote:
> >> On 09 Aug 2015 14:24, Zack Weinberg wrote:
> >> > Is an IFUNC's variant-selecting function called only once per process,
> >> > or every time?
> >> it's once-per-process. if it were every time, it'd defeat the point of the
> >> optimization.
> > No, its once per each shared library.
> I don't see how that can possibly be right.
I see that OndÅej already replied to you, but since I found his response hard
to follow (even being familiar with the topic), I'll try to explain in my own
> Doesn't each shared
> library provide the one true PLT entry for each function it exports?
No, shared libraries have PLT entries for functions they "import". Also, the
main (non-PIE) executable will have simpler PLT entries for functions it
calls, and when it does, the address of the PLT entry in the main executable
becomes the canonical address for the function.
> If not, how can we be obeying the C standard's rules about function
> pointer equality?
If the main executable does not have the PLT slot that would be the canonical
address, then with an IFUNC resolver that returns different addresses at
different invocations, you can get to a situation when functions with the same
name can be seen from different DSOs as having different addresses. If
there's interest I'll send a testcase. But overall it simply demonstrates
that if you do an unusual thing in the resolver, you get an unusual result.
There's no specification on what resolvers can and cannot do.
Hope that helps.