This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils 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]

src bfd/ChangeLog bfd/elf-ifunc.c ld/testsuite ...


CVSROOT:	/cvs/src
Module name:	src
Changes by:	hjl@sourceware.org	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  <hongjiu.lu@intel.com>
	
	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  <hongjiu.lu@intel.com>
	
	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	ifunc@PLT
	+	.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


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