Jakub Jelinek 98da9d
2009-11-08  H.J. Lu  <hongjiu.lu@intel.com>
Jakub Jelinek 98da9d
Jakub Jelinek 98da9d
	PR ld/10911
Jakub Jelinek 98da9d
	* elflink.c (elf_link_output_extsym): Don't return on
Jakub Jelinek 98da9d
	STT_GNU_IFUNC symbol when stripping.
Jakub Jelinek 98da9d
Jakub Jelinek 98da9d
	* ld-ifunc/ifunc-4a-x86.d: New.
Jakub Jelinek 98da9d
Jakub Jelinek 98da9d
--- bfd/elflink.c
Jakub Jelinek 98da9d
+++ bfd/elflink.c
Jakub Jelinek 98da9d
@@ -8639,9 +8639,11 @@ elf_link_output_extsym (struct elf_link_hash_entry *h, void *data)
Jakub Jelinek 98da9d
     strip = FALSE;
Jakub Jelinek 98da9d
 
Jakub Jelinek 98da9d
   /* If we're stripping it, and it's not a dynamic symbol, there's
Jakub Jelinek 98da9d
-     nothing else to do unless it is a forced local symbol.  */
Jakub Jelinek 98da9d
+     nothing else to do unless it is a forced local symbol or a
Jakub Jelinek 98da9d
+     STT_GNU_IFUNC symbol.  */
Jakub Jelinek 98da9d
   if (strip
Jakub Jelinek 98da9d
       && h->dynindx == -1
Jakub Jelinek 98da9d
+      && h->type != STT_GNU_IFUNC
Jakub Jelinek 98da9d
       && !h->forced_local)
Jakub Jelinek 98da9d
     return TRUE;
Jakub Jelinek 98da9d
 
Jakub Jelinek 98da9d
--- ld/testsuite/ld-ifunc/ifunc-4a-x86.d
Jakub Jelinek 98da9d
+++ ld/testsuite/ld-ifunc/ifunc-4a-x86.d
Jakub Jelinek 98da9d
@@ -0,0 +1,8 @@
Jakub Jelinek 98da9d
+#ld: -s
Jakub Jelinek 98da9d
+#readelf: -r --wide
Jakub Jelinek 98da9d
+#target: x86_64-*-* i?86-*-*
Jakub Jelinek 98da9d
+#source: ifunc-4-x86.s
Jakub Jelinek 98da9d
+
Jakub Jelinek 98da9d
+#...
Jakub Jelinek 98da9d
+[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_[_0-9A-Z]+_IRELATIVE[ ]*[0-9a-f]*
Jakub Jelinek 98da9d
+#pass