This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Don't use hidden visibility in libc.a with PIE on i386


On Wed, Aug 23, 2017 at 2:23 AM, Florian Weimer <fweimer@redhat.com> wrote:
> On 08/23/2017 12:44 AM, H.J. Lu wrote:
>> On i386, when multi-arch is enabled, all external functions must be
>> called via PIC PLT in PIE, which requires setting up EBX register,
>> since they may be IFUNC functions.
>
> This explanation does not make sense to me.  Could you elaborate further?

When a linker detects a call to a hidden IFUNC function, foo, it will create a
PLT entry and resolve

call foo

to

call foo@PLT

On i386, there are 2 kinds of PLT:

1. PLT:

080499a0 <strstr@plt>:
 80499a0: ff 25 0c 00 22 08     jmp    *0x822000c
 80499a6: 68 00 00 00 00       push   $0x0
 80499ab: e9 e0 ff ff ff       jmp    8049990 <.plt>

This is used for non-PIC binary since the address of GOT is fixed.

2. PIC PLT:

000178a0 <_Unwind_Find_FDE@plt>:
   178a0: ff a3 0c 00 00 00     jmp    *0xc(%ebx)
   178a6: 68 00 00 00 00       push   $0x0
   178ab: e9 e0 ff ff ff       jmp    17890 <.plt>

This is used for PIC binary since the address of GOT is in EBX.

For non-PIC binary, it is OK to turn

call foo

to

call foo@PLT

since GOT is at the fixed address.  But for PIE, it isn't OK to
turn

call foo

to

call foo@PLT

since PIE uses PIC PLT and EBX doesn't have the address of
GOT.


-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]