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: Proposal for STT_GNU_IFUNC and R_*_IRELATIVE


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

H.J. Lu wrote:
> How to do you handle R_*_PC32 relocation to a locally defined
> STT_GNU_IFUNC symbol in dynamic and static executables?

When I compile the test code you sent yesterday I see this in the
executable:

000000000040050c <main>:
  40050c:       55                      push   %rbp
  40050d:       48 89 e5                mov    %rsp,%rbp
  400510:       bf fd ff ff ff          mov    $0xfffffffd,%edi
  400515:       e8 00 00 00 00          callq  40051a <main+0xe>
  40051a:       b8 00 00 00 00          mov    $0x0,%eax
  40051f:       c9                      leaveq
  400520:       c3                      retq


This is of course not going to work.  The program doesn't even contain a
R_*_IRELATIVE relocation.

Every call to an IFUNC must be indirect somewhere.  You cannot change
the relative jmp into an indirect one (opcode is too long).  Therefore,
as I explained before, you allocate and jump to a PLT slot.  The PLT
slot as a GOT entry and that GOT entry in modified by the R_*_IRELATIVE
relocation.

Of course something can be wrong with the code I get.  So, why don't you
take the time to actually explain what you see at the asm level.

- --
â Ulrich Drepper â Red Hat, Inc. â 444 Castro St â Mountain View, CA â
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEARECAAYFAkodflIACgkQ2ijCOnn/RHSk0ACgqqWSCBZ8Mu+vmC1ELvtBeZWA
/I8AoKo14TajUZ8ovA0SUYBSkvEKBJLZ
=eYJl
-----END PGP SIGNATURE-----


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