bug-binutils
[Top][All Lists]
Advanced

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

[Bug ld/15371] uninitialised ifunc symbol


From: cvs-commit at gcc dot gnu.org
Subject: [Bug ld/15371] uninitialised ifunc symbol
Date: Mon, 15 Apr 2013 21:16:20 +0000

http://sourceware.org/bugzilla/show_bug.cgi?id=15371

--- Comment #3 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot 
gnu.org> 2013-04-15 21:16:20 UTC ---
CVSROOT:    /cvs/src
Module name:    src
Changes by:    address@hidden    2013-04-15 21:16:18

Modified files:
    bfd            : ChangeLog elf-ifunc.c 
    ld/testsuite   : ChangeLog 
Added files:
    ld/testsuite/ld-ifunc: ifunc-20-i386.d ifunc-20-x86-64.d 
                           ifunc-20.s 

Log message:
    Check regular reference without non-GOT reference

    non_got_ref may not be set when building shared library. We need to set
    non_got_ref if there are any non-PIC relocations.  But we only did this
    when there were no PLT/GOT relocations.  It failed when there is a PLT
    relocation.  This checkin moves the non_got_ref check out.

    bfd/

    2013-04-15  H.J. Lu  <address@hidden>

    PR ld/15371
    * elf-ifunc.c (_bfd_elf_allocate_ifunc_dyn_relocs): Check
    regular reference without non-GOT reference when building
    shared library.

    ld/testsuite/

    2013-04-15  H.J. Lu  <address@hidden>

    PR ld/15371
    * ld-ifunc/ifunc-20-i386.d: New file.
    * ld-ifunc/ifunc-20-x86-64.d: Likewise.
    * ld-ifunc/ifunc-20.s: Likewise.
    diff --git a/bfd/elf-ifunc.c b/bfd/elf-ifunc.c
    index e56427d..7e7ec36 100644
    --- a/bfd/elf-ifunc.c
    +++ b/bfd/elf-ifunc.c
    @@ -187,23 +187,20 @@ _bfd_elf_allocate_ifunc_dyn_relocs (struct
bfd_link_info *info,

    htab = elf_hash_table (info);

    +  /* When building shared library, we need to handle the case where it is
    +     marked with regular reference, but not non-GOT reference since the
    +     non-GOT reference bit may not be set here.  */
    +  if (info->shared && !h->non_got_ref && h->ref_regular)
    +    for (p = *head; p != NULL; p = p->next)
    +      if (p->count)
    +    {
    +      h->non_got_ref = 1;
    +      goto keep;
    +    }
    +
    /* Support garbage collection against STT_GNU_IFUNC symbols.  */
    if (h->plt.refcount <= 0 && h->got.refcount <= 0)
    {
    -      /* When building shared library, we need to handle the case
    -         where it is marked with regular reference, but not non-GOT
    -     reference.  It may happen if we didn't see STT_GNU_IFUNC
    -     symbol at the time when checking relocations.  */
    -      if (info->shared
    -      && !h->non_got_ref
    -      && h->ref_regular)
    -    for (p = *head; p != NULL; p = p->next)
    -      if (p->count)
    -        {
    -          h->non_got_ref = 1;
    -          goto keep;
    -        }
    -
    h->got = htab->init_got_offset;
    h->plt = htab->init_plt_offset;
    *head = NULL;
    diff --git a/ld/testsuite/ld-ifunc/ifunc-20-i386.d
b/ld/testsuite/ld-ifunc/ifunc-20-i386.d
    new file mode 100644
    index 0000000..9373fcf
    --- /dev/null
    +++ b/ld/testsuite/ld-ifunc/ifunc-20-i386.d
    @@ -0,0 +1,13 @@
    +#source: ifunc-20.s
    +#ld: -shared -m elf_i386 -z nocombreloc
    +#as: --32
    +#readelf: -r --wide
    +#target: x86_64-*-* i?86-*-*
    +
    +Relocation section '.rel.ifunc' at offset 0x[0-9a-f]+ contains 1 entries:
    +[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
    +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_32[ ]+ifunc\(\)[ ]+ifunc
    +
    +Relocation section '.rel.plt' at offset 0x[0-9a-f]+ contains 1 entries:
    +[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
    +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc
    diff --git a/ld/testsuite/ld-ifunc/ifunc-20-x86-64.d
b/ld/testsuite/ld-ifunc/ifunc-20-x86-64.d
    new file mode 100644
    index 0000000..39492d4
    --- /dev/null
    +++ b/ld/testsuite/ld-ifunc/ifunc-20-x86-64.d
    @@ -0,0 +1,13 @@
    +#source: ifunc-20.s
    +#ld: -shared -m elf_x86_64 -z nocombreloc
    +#as: --64
    +#readelf: -r --wide
    +#target: x86_64-*-*
    +
    +Relocation section '.rela.ifunc' at offset 0x[0-9a-f]+ contains 1 entries:
    +[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
    +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_64[ ]+ifunc\(\)[ ]+ifunc \+ 0
    +
    +Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
    +[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
    +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc \+ 0
    diff --git a/ld/testsuite/ld-ifunc/ifunc-20.s
b/ld/testsuite/ld-ifunc/ifunc-20.s
    new file mode 100644
    index 0000000..9d45455
    --- /dev/null
    +++ b/ld/testsuite/ld-ifunc/ifunc-20.s
    @@ -0,0 +1,16 @@
    +    .section .data.rel,"aw",@progbits
    +    .globl ifunc_ptrt
    +    .type    ifunc_ptr, @object
    +ifunc_ptr:
    +    .dc.a ifunc
    +    .text
    +    .type ifunc, @gnu_indirect_function
    +    .globl ifunc
    +ifunc:
    +    ret
    +    .size    ifunc, .-ifunc
    +    .type bar, @function
    +    .globl bar
    +bar:
    +    call    address@hidden
    +    .size    bar, .-bar

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/ChangeLog.diff?cvsroot=src&r1=1.6027&r2=1.6028
http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/elf-ifunc.c.diff?cvsroot=src&r1=1.8&r2=1.9
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ChangeLog.diff?cvsroot=src&r1=1.1708&r2=1.1709
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-20-i386.d.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-20-x86-64.d.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-ifunc/ifunc-20.s.diff?cvsroot=src&r1=NONE&r2=1.1

-- 
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
------- 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]