bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug ld/20253] Unnecessary PLT entry for IFUNC function via GOT


From: cvs-commit at gcc dot gnu.org
Subject: [Bug ld/20253] Unnecessary PLT entry for IFUNC function via GOT
Date: Sat, 18 Jun 2016 16:18:35 +0000

https://sourceware.org/bugzilla/show_bug.cgi?id=20253

--- Comment #1 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot 
gnu.org> ---
The master branch has been updated by H.J. Lu <address@hidden>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=233cc9c13af8e8182d0ce5b306526b59f5b11f37

commit 233cc9c13af8e8182d0ce5b306526b59f5b11f37
Author: H.J. Lu <address@hidden>
Date:   Sat Jun 18 09:16:52 2016 -0700

    Don't generate PLT for IFUNC GOT/pointer reference

    If a backend supports it, PLT entry isn't needed when all references
    to a STT_GNU_IFUNC symbols are done via GOT or static function pointers.
    For GOT entries, We generate dynamic R_*_GLOB_DAT relocations for
    preemptable symbols and R_*_IRELATIVE relocations for non-preemptable
    symbols to update them with real function address.  For static pointer
    pointers, we generate dynamic pointer relocations and store them in:

    1. .rel[a].ifunc section in PIC object.
    2. .rel[a].got section in dynamic executable.
    3. .rel[a].iplt section in static executable.

    We don't allocate GOT entry if it isn't used.

    bfd/

        PR ld/20253
        * elf-bfd.h (_bfd_elf_allocate_ifunc_dyn_relocs): Add an
        bfd_boolean argument.
        * elf-ifunc.c (_bfd_elf_create_ifunc_sections): Replace
        "shared object" with "PIC object" in comments.
        (_bfd_elf_allocate_ifunc_dyn_relocs): Updated.  Replace
        "shared object" with "PIC object" in comments.  Avoid PLT if
        requested.  Generate dynamic relocations for non-GOT references.
        Make room for the special first entry in PLT and allocate PLT
        entry only for PLT and PC-relative references.  Store dynamic
        GOT relocations in .rel[a].iplt section for static executables.
        If PLT isn't used, always use GOT for symbol value.  Don't
        allocate GOT entry if it isn't used.
        * elf32-i386.c (elf_i386_check_relocs): Increment PLT reference
        count only in the code section.  Allocate dynamic pointer
        relocation against STT_GNU_IFUNC symbol in the non-code section.
        (elf_i386_adjust_dynamic_symbol): Increment PLT reference count
        only for PC-relative references.
        (elf_i386_allocate_dynrelocs): Pass TRUE to
        _bfd_elf_allocate_ifunc_dyn_relocs.
        (elf_i386_relocate_section): Allow R_386_GOT32/R_386_GOT32X
        relocations against STT_GNU_IFUNC symbols without PLT.  Generate
        dynamic pointer relocation against STT_GNU_IFUNC symbol in
        the non-code section and store it in the proper REL section.
        Don't allow non-pointer relocation against STT_GNU_IFUNC symbol
        without PLT.
        (elf_i386_finish_dynamic_symbol): Generate dynamic
        R_386_IRELATIVE and R_386_GLOB_DAT GOT relocations against
        STT_GNU_IFUNC symbols without PLT.
        (elf_i386_finish_dynamic_sections): Don't handle local
        STT_GNU_IFUNC symbols here.
        (elf_i386_output_arch_local_syms): Handle local STT_GNU_IFUNC
        symbols here.
        (elf_backend_output_arch_local_syms): New.
        * elf32-x86-64.c (elf_i386_check_relocs): Increment PLT reference
        count only in the code section.  Allocate dynamic pointer
        relocation against STT_GNU_IFUNC symbol in the non-code section.
        (elf_x86_64_adjust_dynamic_symbol): Increment PLT reference
        count only for PC-relative references.
        (elf_x86_64_allocate_dynrelocs): Pass TRUE to
        _bfd_elf_allocate_ifunc_dyn_relocs.
        (elf_x86_64_relocate_section): Allow R_X86_64_GOTPCREL,
        R_X86_64_GOTPCRELX, R_X86_64_REX_GOTPCRELX and
        R_X86_64_GOTPCREL64 relocations against STT_GNU_IFUNC symbols
        without PLT.  Generate dynamic pointer relocation against
        STT_GNU_IFUNC symbol in the non-code section and store it in
        the proper RELA section.  Don't allow non-pointer relocation
        against STT_GNU_IFUNC symbol without PLT.
        (elf_x86_64_finish_dynamic_symbol): Generate dynamic
        R_X86_64_IRELATIVE and R_X86_64_GLOB_DAT GOT relocations against
        STT_GNU_IFUNC symbols without PLT.
        (elf_x86_64_finish_dynamic_sections): Don't handle local
        STT_GNU_IFUNC symbols here.
        (elf_x86_64_output_arch_local_syms): Handle local STT_GNU_IFUNC
        symbols here.
        (elf_backend_output_arch_local_syms): New.
        * elfnn-aarch64.c (elfNN_aarch64_allocate_ifunc_dynrelocs):
        Pass FALSE to _bfd_elf_allocate_ifunc_dyn_relocs.

    ld/

        PR ld/20253
        * testsuite/ld-i386/i386.exp: Run PR ld/20253 tests.
        * testsuite/ld-i386/no-plt.exp: Likewise.
        * testsuite/ld-x86-64/no-plt.exp: Likewise.
        * testsuite/ld-i386/pr13302.d: Remove .rel.plt section.
        * testsuite/ld-ifunc/ifunc-13-i386.d: Likewise.
        * testsuite/ld-ifunc/ifunc-13-x86-64.d: Likewise.
        * testsuite/ld-ifunc/ifunc-15-i386.d: Likewise.
        * testsuite/ld-ifunc/ifunc-15-x86-64.d: Likewise.
        * testsuite/ld-x86-64/pr13082-5a.d: Likewise.
        * testsuite/ld-x86-64/pr13082-5b.d: Likewise.
        * testsuite/ld-x86-64/pr13082-6a.d: Likewise.
        * testsuite/ld-x86-64/pr13082-6b.d: Likewise.
        * testsuite/ld-i386/pr20244-2a.d: Remove .plt section.
        * testsuite/ld-ifunc/ifunc-21-i386.d: Likewise.
        * testsuite/ld-ifunc/ifunc-21-x86-64.d: Likewise.
        * testsuite/ld-ifunc/ifunc-22-i386.d: Likewise.
        * testsuite/ld-ifunc/ifunc-22-x86-64.d: Likewise.
        * testsuite/ld-i386/pr20244-2b.d: Updated.
        * testsuite/ld-i386/pr20244-2c.d: Likewise.
        * testsuite/ld-ifunc/ifunc-18a-i386.d: Likewise.
        * testsuite/ld-ifunc/ifunc-18a-x86-64.d: Likewise.
        * testsuite/ld-ifunc/ifunc-18b-i386.d: Likewise.
        * testsuite/ld-ifunc/ifunc-18b-x86-64.d: Likewise.
        * testsuite/ld-i386/pr20253-1a.c: New file.
        * testsuite/ld-i386/pr20253-1b.S: Likewise.
        * testsuite/ld-i386/pr20253-1c.S: Likewise.
        * testsuite/ld-i386/pr20253-1d.S: Likewise.
        * testsuite/ld-i386/pr20253-2a.c: Likewise.
        * testsuite/ld-i386/pr20253-2b.S: Likewise.
        * testsuite/ld-i386/pr20253-2c.S: Likewise.
        * testsuite/ld-i386/pr20253-2d.S: Likewise.
        * testsuite/ld-i386/pr20253-3.d: Likewise.
        * testsuite/ld-i386/pr20253-3.s: Likewise.
        * testsuite/ld-i386/pr20253-4.s: Likewise.
        * testsuite/ld-i386/pr20253-4a.d: Likewise.
        * testsuite/ld-i386/pr20253-4b.d: Likewise.
        * testsuite/ld-i386/pr20253-4c.d: Likewise.
        * testsuite/ld-i386/pr20253-5.d: Likewise.
        * testsuite/ld-i386/pr20253-5.s: Likewise.
        * testsuite/ld-ifunc/ifunc-23-x86.s: Likewise.
        * testsuite/ld-ifunc/ifunc-23a-x86.d: Likewise.
        * testsuite/ld-ifunc/ifunc-23b-x86.d: Likewise.
        * testsuite/ld-ifunc/ifunc-23c-x86.d: Likewise.
        * testsuite/ld-ifunc/ifunc-24-x86.s: Likewise.
        * testsuite/ld-ifunc/ifunc-24a-x86.d: Likewise.
        * testsuite/ld-ifunc/ifunc-24b-x86.d: Likewise.
        * testsuite/ld-ifunc/ifunc-24c-x86.d: Likewise.
        * testsuite/ld-ifunc/ifunc-25-x86.s: Likewise.
        * testsuite/ld-ifunc/ifunc-25a-x86.d: Likewise.
        * testsuite/ld-ifunc/ifunc-25b-x86.d: Likewise.
        * testsuite/ld-ifunc/ifunc-25c-x86.d: Likewise.
        * testsuite/ld-x86-64/pr20253-1.s: Likewise.
        * testsuite/ld-x86-64/pr20253-1a.d: Likewise.
        * testsuite/ld-x86-64/pr20253-1b.d: Likewise.
        * testsuite/ld-x86-64/pr20253-1c.d: Likewise.
        * testsuite/ld-x86-64/pr20253-1d.d: Likewise.
        * testsuite/ld-x86-64/pr20253-1e.d: Likewise.
        * testsuite/ld-x86-64/pr20253-1f.d: Likewise.
        * testsuite/ld-x86-64/pr20253-1g.d: Likewise.
        * testsuite/ld-x86-64/pr20253-1h.d: Likewise.
        * testsuite/ld-x86-64/pr20253-1i.d: Likewise.
        * testsuite/ld-x86-64/pr20253-1j.d: Likewise.
        * testsuite/ld-x86-64/pr20253-1k.d: Likewise.
        * testsuite/ld-x86-64/pr20253-1l.d: Likewise.
        * testsuite/ld-x86-64/pr20253-2a.c: Likewise.
        * testsuite/ld-x86-64/pr20253-2b.S: Likewise.
        * testsuite/ld-x86-64/pr20253-2c.S: Likewise.
        * testsuite/ld-x86-64/pr20253-2d.S: Likewise.
        * testsuite/ld-x86-64/pr20253-3.d: Likewise.
        * testsuite/ld-x86-64/pr20253-3.s: Likewise.
        * testsuite/ld-x86-64/pr20253-4.s: Likewise.
        * testsuite/ld-x86-64/pr20253-4a.d: Likewise.
        * testsuite/ld-x86-64/pr20253-4b.d: Likewise.
        * testsuite/ld-x86-64/pr20253-4c.d: Likewise.
        * testsuite/ld-x86-64/pr20253-4d.d: Likewise.
        * testsuite/ld-x86-64/pr20253-4e.d: Likewise.
        * testsuite/ld-x86-64/pr20253-4f.d: Likewise.
        * testsuite/ld-x86-64/pr20253-5.s: Likewise.
        * testsuite/ld-x86-64/pr20253-5a.d: Likewise.
        * testsuite/ld-x86-64/pr20253-5b.d: Likewise.
        * testsuite/ld-ifunc/ifunc-18a-i386.d: Remove extra IRELATIVE
        relocation.
        * testsuite/ld-ifunc/ifunc-18a-x86-64.d: Likewise.
        * testsuite/ld-ifunc/ifunc-18b-i386.d: Likewise.
        * testsuite/ld-ifunc/ifunc-18b-x86-64.d: Likewise.
        * testsuite/ld-ifunc/ifunc-18a.s: Fix a typo.
        * testsuite/ld-x86-64/x86-64.exp: Run pr20253-1 tests.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]