This is the mail archive of the
mailing list for the glibc project.
Re: [PATCH] x86-64: Implement strcpy family IFUNC selectors in C
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Zack Weinberg <zackw at panix dot com>
- Cc: GNU C Library <libc-alpha at sourceware dot org>
- Date: Sun, 11 Jun 2017 07:21:50 -0700
- Subject: Re: [PATCH] x86-64: Implement strcpy family IFUNC selectors in C
- Authentication-results: sourceware.org; auth=none
- References: <20170611135042.GA22931@gmail.com> <email@example.com>
On Sun, Jun 11, 2017 at 7:01 AM, Zack Weinberg <firstname.lastname@example.org> wrote:
> On 06/11/2017 09:50 AM, H.J. Lu wrote:
>> Implement strcpy family IFUNC selectors in C.
>> All internal calls within libc.so can use IFUNC on x86-64 since unlike
>> x86, x86-64 doesn't need to reserve a register to make a PLT call. For
>> libc,a, we can't use IFUNC for functions which are called before IFUNC
>> has been initialized. Use IFUNC internally reduces the icache footprint
>> since libc.so and other codes in the process use the same implementations.
>> The patch uses IFUNC for strcpy family functions within libc.
>> Any comments?
> I like the idea, but I don't understand ifuncs nearly well enough to
> comment on your code. I recall _strenuous_ objections to this concept
> in the past; please post some performance numbers or something.
I don't believe there is a benchmark where hot spots are within libc.so.
BTW, if there are such benchmarks, I'd love to know.
The main benefit is to reduce icache footprint at a price of an indirect
branch via PLT. The main issue to use IFUNC internally in libc.so was
for x86, EBX must be used to call via PLT. This can be expensive since
we need to load EBX with GOT and preserve EBX for PLT call. On x86-64,
PC-relative address is used for PLT. We only replace a direct branch with
an indirect branch.