This is the mail archive of the binutils@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]

PowerPC64 mixed ABI fixes and cleanup


This fixes some problems I noticed when mixing old-ABI and new-ABI
objects/libraries.  The ppc64 backend associates function descriptor
symbols with their code entry symbols, and vice versa, using an extra
pointer in the symbol link_hash_entry.  When versioned symbols are
involved, you can end up with the extra pointer pointing to an
indirect symbol, which confuses tests that check whether the
associated symbol is defined.  So follow indirect function links
everywhere.  This also fixes some potential problems with
--gc-sections with old-ABI objects and symbol versioning.

I also made undefined dot-symbols weak rather than defining them on a
plt-call stub.  They'll still be defined on the function entry for
old-ABI objects that refer to the dot-sym on branches, if a new-ABI
object provides a static function definition.  It's only when the
definition is dynamic that there is a change.

bfd/
	* elf64-ppc.c (follow_link, elf_follow_link, ppc_follow_link): New
	functions.  Use throughout.
	(ppc64_elf_copy_indirect_symbol): Set direct symbol "oh" field
	from indirect symbol.
	(lookup_fdh): Rename from get_fdh.  Follow indirect sym links.
	(add_symbol_adjust): Simplify.
	(defined_code_entry, defined_func_desc): New functions.
	(ppc64_elf_gc_keep): Follow indirect sym links.  Use defined_code_entry.
	(ppc64_elf_gc_mark_dynamic_ref): Use defined_func_desc and
	defined_code_entry to follow indirect sym links.
	(ppc64_elf_gc_mark_hook, func_desc_adjust): Likewise.
	(ppc_type_of_stub): Follow indirect sym links.
	(toc_adjusting_stub_needed): Likewise.
	(ppc_build_one_stub): Likewise.  Make undefined dot-symbols weak
	rather than defining them at stub.
	(ppc64_elf_relocate_section): Rewrite call test to avoid multiple
	assignments in test.
ld/testsuite/
	* ld-powerpc/tlsso.d: Update.
	* ld-powerpc/tlsso.r: Update.
	* ld-powerpc/tlstocso.d: Update.
	* ld-powerpc/tlstocso.r: Update.

Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.299
diff -u -p -r1.299 elf64-ppc.c
--- bfd/elf64-ppc.c	29 Jul 2009 14:56:38 -0000	1.299
+++ bfd/elf64-ppc.c	18 Sep 2009 01:45:42 -0000
@@ -4282,6 +4282,29 @@ ppc64_elf_create_dynamic_sections (bfd *
   return TRUE;
 }
 
+/* Follow indirect and warning symbol links.  */
+
+static inline struct bfd_link_hash_entry *
+follow_link (struct bfd_link_hash_entry *h)
+{
+  while (h->type == bfd_link_hash_indirect
+	 || h->type == bfd_link_hash_warning)
+    h = h->u.i.link;
+  return h;
+}
+
+static inline struct elf_link_hash_entry *
+elf_follow_link (struct elf_link_hash_entry *h)
+{
+  return (struct elf_link_hash_entry *) follow_link (&h->root);
+}
+
+static inline struct ppc_link_hash_entry *
+ppc_follow_link (struct ppc_link_hash_entry *h)
+{
+  return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
+}
+
 /* Merge PLT info on FROM with that on TO.  */
 
 static void
@@ -4364,6 +4387,8 @@ ppc64_elf_copy_indirect_symbol (struct b
   edir->is_func |= eind->is_func;
   edir->is_func_descriptor |= eind->is_func_descriptor;
   edir->tls_mask |= eind->tls_mask;
+  if (eind->oh != NULL)
+    edir->oh = ppc_follow_link (eind->oh);
 
   /* If called to transfer flags for a weakdef during processing
      of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
@@ -4433,7 +4458,7 @@ ppc64_elf_copy_indirect_symbol (struct b
    hash entry FH.  Link the entries via their OH fields.  */
 
 static struct ppc_link_hash_entry *
-get_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
+lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
 {
   struct ppc_link_hash_entry *fdh = fh->oh;
 
@@ -4443,16 +4468,16 @@ get_fdh (struct ppc_link_hash_entry *fh,
 
       fdh = (struct ppc_link_hash_entry *)
 	elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
-      if (fdh != NULL)
-	{
-	  fdh->is_func_descriptor = 1;
-	  fdh->oh = fh;
-	  fh->is_func = 1;
-	  fh->oh = fdh;
-	}
+      if (fdh == NULL)
+	return fdh;
+
+      fdh->is_func_descriptor = 1;
+      fdh->oh = fh;
+      fh->is_func = 1;
+      fh->oh = fdh;
     }
 
-  return fdh;
+  return ppc_follow_link (fdh);
 }
 
 /* Make a fake function descriptor sym for the code sym FH.  */
@@ -4574,23 +4599,24 @@ add_symbol_adjust (struct ppc_link_hash_
     abort ();
 
   htab = ppc_hash_table (info);
-  fdh = get_fdh (eh, htab);
-  if (fdh == NULL
-      && !info->relocatable
-      && (eh->elf.root.type == bfd_link_hash_undefined
-	  || eh->elf.root.type == bfd_link_hash_undefweak)
-      && eh->elf.ref_regular)
-    {
-      /* Make an undefweak function descriptor sym, which is enough to
-	 pull in an --as-needed shared lib, but won't cause link
-	 errors.  Archives are handled elsewhere.  */
-      fdh = make_fdh (info, eh);
-      if (fdh == NULL)
-	return FALSE;
-      else
-	fdh->elf.ref_regular = 1;
+  fdh = lookup_fdh (eh, htab);
+  if (fdh == NULL)
+    {
+      if (!info->relocatable
+	  && (eh->elf.root.type == bfd_link_hash_undefined
+	      || eh->elf.root.type == bfd_link_hash_undefweak)
+	  && eh->elf.ref_regular)
+	{
+	  /* Make an undefweak function descriptor sym, which is enough to
+	     pull in an --as-needed shared lib, but won't cause link
+	     errors.  Archives are handled elsewhere.  */
+	  fdh = make_fdh (info, eh);
+	  if (fdh == NULL)
+	    return FALSE;
+	  fdh->elf.ref_regular = 1;
+	}
     }
-  else if (fdh != NULL)
+  else
     {
       unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
       unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
@@ -4839,9 +4865,7 @@ ppc64_elf_check_relocs (bfd *abfd, struc
       else
 	{
 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
-	  while (h->root.type == bfd_link_hash_indirect
-		 || h->root.type == bfd_link_hash_warning)
-	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
+	  h = elf_follow_link (h);
 	}
 
       tls_type = 0;
@@ -5199,7 +5223,7 @@ ppc64_elf_check_relocs (bfd *abfd, struc
 		{
 		  if (h->root.root.string[0] == '.'
 		      && h->root.root.string[1] != 0
-		      && get_fdh ((struct ppc_link_hash_entry *) h, htab))
+		      && lookup_fdh ((struct ppc_link_hash_entry *) h, htab))
 		    ;
 		  else
 		    ((struct ppc_link_hash_entry *) h)->is_func = 1;
@@ -5452,9 +5476,7 @@ opd_entry_value (asection *opd_sec,
 
 		  sym_hashes = elf_sym_hashes (opd_bfd);
 		  rh = sym_hashes[symndx - symtab_hdr->sh_info];
-		  while (rh->root.type == bfd_link_hash_indirect
-			 || rh->root.type == bfd_link_hash_warning)
-		    rh = ((struct elf_link_hash_entry *) rh->root.u.i.link);
+		  rh = elf_follow_link (rh);
 		  BFD_ASSERT (rh->root.type == bfd_link_hash_defined
 			      || rh->root.type == bfd_link_hash_defweak);
 		  val = rh->root.u.def.value;
@@ -5475,6 +5497,39 @@ opd_entry_value (asection *opd_sec,
   return val;
 }
 
+/* If FDH is a function descriptor symbol, return the associated code
+   entry symbol if it is defined.  Return NULL otherwise.  */
+
+static struct ppc_link_hash_entry *
+defined_code_entry (struct ppc_link_hash_entry *fdh)
+{
+  if (fdh->is_func_descriptor)
+    {
+      struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
+      if (fh->elf.root.type == bfd_link_hash_defined
+	  || fh->elf.root.type == bfd_link_hash_defweak)
+	return fh;
+    }
+  return NULL;
+}
+
+/* If FH is a function code entry symbol, return the associated
+   function descriptor symbol if it is defined.  Return NULL otherwise.  */
+
+static struct ppc_link_hash_entry *
+defined_func_desc (struct ppc_link_hash_entry *fh)
+{
+  if (fh->oh != NULL
+      && fh->oh->is_func_descriptor)
+    {
+      struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
+      if (fdh->elf.root.type == bfd_link_hash_defined
+	  || fdh->elf.root.type == bfd_link_hash_defweak)
+	return fdh;
+    }
+  return NULL;
+}
+
 /* Mark all our entry sym sections, both opd and code section.  */
 
 static void
@@ -5485,22 +5540,21 @@ ppc64_elf_gc_keep (struct bfd_link_info 
 
   for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
     {
-      struct ppc_link_hash_entry *eh;
+      struct ppc_link_hash_entry *eh, *fh;
       asection *sec;
 
       eh = (struct ppc_link_hash_entry *)
-	elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, FALSE);
+	elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
       if (eh == NULL)
 	continue;
       if (eh->elf.root.type != bfd_link_hash_defined
 	  && eh->elf.root.type != bfd_link_hash_defweak)
 	continue;
 
-      if (eh->is_func_descriptor
-	  && (eh->oh->elf.root.type == bfd_link_hash_defined
-	      || eh->oh->elf.root.type == bfd_link_hash_defweak))
+      fh = defined_code_entry (eh);
+      if (fh != NULL)
 	{
-	  sec = eh->oh->elf.root.u.def.section;
+	  sec = fh->elf.root.u.def.section;
 	  sec->flags |= SEC_KEEP;
 	}
       else if (get_opd_info (eh->elf.root.u.def.section) != NULL
@@ -5523,16 +5577,15 @@ ppc64_elf_gc_mark_dynamic_ref (struct el
 {
   struct bfd_link_info *info = (struct bfd_link_info *) inf;
   struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
+  struct ppc_link_hash_entry *fdh;
 
   if (eh->elf.root.type == bfd_link_hash_warning)
     eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
 
   /* Dynamic linking info is on the func descriptor sym.  */
-  if (eh->oh != NULL
-      && eh->oh->is_func_descriptor
-      && (eh->oh->elf.root.type == bfd_link_hash_defined
-	  || eh->oh->elf.root.type == bfd_link_hash_defweak))
-    eh = eh->oh;
+  fdh = defined_func_desc (eh);
+  if (fdh != NULL)
+    eh = fdh;
 
   if ((eh->elf.root.type == bfd_link_hash_defined
        || eh->elf.root.type == bfd_link_hash_defweak)
@@ -5543,15 +5596,18 @@ ppc64_elf_gc_mark_dynamic_ref (struct el
 	      && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN)))
     {
       asection *code_sec;
+      struct ppc_link_hash_entry *fh;
 
       eh->elf.root.u.def.section->flags |= SEC_KEEP;
 
       /* Function descriptor syms cause the associated
 	 function code sym section to be marked.  */
-      if (eh->is_func_descriptor
-	  && (eh->oh->elf.root.type == bfd_link_hash_defined
-	      || eh->oh->elf.root.type == bfd_link_hash_defweak))
-	eh->oh->elf.root.u.def.section->flags |= SEC_KEEP;
+      fh = defined_code_entry (eh);
+      if (fh != NULL)
+	{
+	  code_sec = fh->elf.root.u.def.section;
+	  code_sec->flags |= SEC_KEEP;
+	}
       else if (get_opd_info (eh->elf.root.u.def.section) != NULL
 	       && opd_entry_value (eh->elf.root.u.def.section,
 				   eh->elf.root.u.def.value,
@@ -5583,7 +5639,7 @@ ppc64_elf_gc_mark_hook (asection *sec,
   if (h != NULL)
     {
       enum elf_ppc64_reloc_type r_type;
-      struct ppc_link_hash_entry *eh;
+      struct ppc_link_hash_entry *eh, *fh, *fdh;
 
       r_type = ELF64_R_TYPE (rel->r_info);
       switch (r_type)
@@ -5598,22 +5654,19 @@ ppc64_elf_gc_mark_hook (asection *sec,
 	    case bfd_link_hash_defined:
 	    case bfd_link_hash_defweak:
 	      eh = (struct ppc_link_hash_entry *) h;
-	      if (eh->oh != NULL
-		  && eh->oh->is_func_descriptor
-		  && (eh->oh->elf.root.type == bfd_link_hash_defined
-		      || eh->oh->elf.root.type == bfd_link_hash_defweak))
-		eh = eh->oh;
+	      fdh = defined_func_desc (eh);
+	      if (fdh != NULL)
+		eh = fdh;
 
 	      /* Function descriptor syms cause the associated
 		 function code sym section to be marked.  */
-	      if (eh->is_func_descriptor
-		  && (eh->oh->elf.root.type == bfd_link_hash_defined
-		      || eh->oh->elf.root.type == bfd_link_hash_defweak))
+	      fh = defined_code_entry (eh);
+	      if (fh != NULL)
 		{
 		  /* They also mark their opd section.  */
 		  eh->elf.root.u.def.section->gc_mark = 1;
 
-		  rsec = eh->oh->elf.root.u.def.section;
+		  rsec = fh->elf.root.u.def.section;
 		}
 	      else if (get_opd_info (eh->elf.root.u.def.section) != NULL
 		       && opd_entry_value (eh->elf.root.u.def.section,
@@ -5693,9 +5746,7 @@ ppc64_elf_gc_sweep_hook (bfd *abfd, stru
 	  struct ppc_dyn_relocs *p;
 
 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
-	  while (h->root.type == bfd_link_hash_indirect
-		 || h->root.type == bfd_link_hash_warning)
-	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
+	  h = elf_follow_link (h);
 	  eh = (struct ppc_link_hash_entry *) h;
 
 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
@@ -6081,18 +6132,17 @@ func_desc_adjust (struct elf_link_hash_e
      in dynamic objects are handled elsewhere.  */
   if (fh->elf.root.type == bfd_link_hash_undefweak
       && fh->was_undefined
-      && (fh->oh->elf.root.type == bfd_link_hash_defined
-	  || fh->oh->elf.root.type == bfd_link_hash_defweak)
-      && get_opd_info (fh->oh->elf.root.u.def.section) != NULL
-      && opd_entry_value (fh->oh->elf.root.u.def.section,
-			  fh->oh->elf.root.u.def.value,
+      && (fdh = defined_func_desc (fh)) != NULL
+      && get_opd_info (fdh->elf.root.u.def.section) != NULL
+      && opd_entry_value (fdh->elf.root.u.def.section,
+			  fdh->elf.root.u.def.value,
 			  &fh->elf.root.u.def.section,
 			  &fh->elf.root.u.def.value) != (bfd_vma) -1)
     {
-      fh->elf.root.type = fh->oh->elf.root.type;
+      fh->elf.root.type = fdh->elf.root.type;
       fh->elf.forced_local = 1;
-      fh->elf.def_regular = fh->oh->elf.def_regular;
-      fh->elf.def_dynamic = fh->oh->elf.def_dynamic;
+      fh->elf.def_regular = fdh->elf.def_regular;
+      fh->elf.def_dynamic = fdh->elf.def_dynamic;
     }
 
   /* If this is a function code symbol, transfer dynamic linking
@@ -6111,12 +6161,7 @@ func_desc_adjust (struct elf_link_hash_e
   /* Find the corresponding function descriptor symbol.  Create it
      as undefined if necessary.  */
 
-  fdh = get_fdh (fh, htab);
-  if (fdh != NULL)
-    while (fdh->elf.root.type == bfd_link_hash_indirect
-	   || fdh->elf.root.type == bfd_link_hash_warning)
-      fdh = (struct ppc_link_hash_entry *) fdh->elf.root.u.i.link;
-
+  fdh = lookup_fdh (fh, htab);
   if (fdh == NULL
       && !info->executable
       && (fh->elf.root.type == bfd_link_hash_undefined
@@ -6454,9 +6499,7 @@ get_sym_h (struct elf_link_hash_entry **
       struct elf_link_hash_entry *h;
 
       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
-      while (h->root.type == bfd_link_hash_indirect
-	     || h->root.type == bfd_link_hash_warning)
-	h = (struct elf_link_hash_entry *) h->root.u.i.link;
+      h = elf_follow_link (h);
 
       if (hp != NULL)
 	*hp = h;
@@ -7024,8 +7067,8 @@ ppc64_elf_edit_opd (bfd *obfd, struct bf
 		  if (h != NULL
 		      && h->root.root.string[0] == '.')
 		    {
-		      fdh = get_fdh ((struct ppc_link_hash_entry *) h,
-				     ppc_hash_table (info));
+		      fdh = lookup_fdh ((struct ppc_link_hash_entry *) h,
+					ppc_hash_table (info));
 		      if (fdh != NULL
 			  && fdh->elf.root.type != bfd_link_hash_defined
 			  && fdh->elf.root.type != bfd_link_hash_defweak)
@@ -7208,9 +7251,7 @@ branch_reloc_hash_match (const bfd *ibfd
       struct elf_link_hash_entry *h;
 
       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
-      while (h->root.type == bfd_link_hash_indirect
-	     || h->root.type == bfd_link_hash_warning)
-	h = (struct elf_link_hash_entry *) h->root.u.i.link;
+      h = elf_follow_link (h);
       if (h == &hash1->elf || h == &hash2->elf)
 	return TRUE;
     }
@@ -8668,9 +8709,9 @@ ppc_type_of_stub (asection *input_sec,
     {
       struct plt_entry *ent;
       struct ppc_link_hash_entry *fdh = h;
-      if (fdh->oh != NULL
-	  && fdh->oh->is_func_descriptor)
-	fdh = fdh->oh;
+      if (h->oh != NULL
+	  && h->oh->is_func_descriptor)
+	fdh = ppc_follow_link (h->oh);
 
       for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
 	if (ent->addend == rel->r_addend
@@ -8944,7 +8985,7 @@ ppc_build_one_stub (struct bfd_hash_entr
 	      hashes[symndx] = &h->elf;
 	      r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
 	      if (h->oh != NULL && h->oh->is_func)
-		h = h->oh;
+		h = ppc_follow_link (h->oh);
 	      if (h->elf.root.u.def.section != stub_entry->target_section)
 		/* H is an opd symbol.  The addend must be zero.  */
 		r->r_addend = 0;
@@ -9109,22 +9150,20 @@ ppc_build_one_stub (struct bfd_hash_entr
       break;
 
     case ppc_stub_plt_call:
-      /* Do the best we can for shared libraries built without
-	 exporting ".foo" for each "foo".  This can happen when symbol
-	 versioning scripts strip all bar a subset of symbols.  */
       if (stub_entry->h != NULL
-	  && stub_entry->h->oh != NULL
-	  && stub_entry->h->oh->elf.root.type != bfd_link_hash_defined
-	  && stub_entry->h->oh->elf.root.type != bfd_link_hash_defweak)
-	{
-	  /* Point the symbol at the stub.  There may be multiple stubs,
-	     we don't really care;  The main thing is to make this sym
-	     defined somewhere.  Maybe defining the symbol in the stub
-	     section is a silly idea.  If we didn't do this, htab->top_id
-	     could disappear.  */
-	  stub_entry->h->oh->elf.root.type = bfd_link_hash_defined;
-	  stub_entry->h->oh->elf.root.u.def.section = stub_entry->stub_sec;
-	  stub_entry->h->oh->elf.root.u.def.value = stub_entry->stub_offset;
+	  && stub_entry->h->is_func_descriptor
+	  && stub_entry->h->oh != NULL)
+	{
+	  struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
+
+	  /* If the old-ABI "dot-symbol" is undefined make it weak so
+	     we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL.
+	     FIXME: We used to define the symbol on one of the call
+	     stubs instead, which is why we test symbol section id
+	     against htab->top_id in various places.  Likely all
+	     these checks could now disappear.  */
+	  if (fh->elf.root.type == bfd_link_hash_undefined)
+	    fh->elf.root.type = bfd_link_hash_undefweak;
 	}
 
       /* Now build the stub.  */
@@ -9561,7 +9600,7 @@ toc_adjusting_stub_needed (struct bfd_li
       if (eh != NULL
 	  && (eh->elf.plt.plist != NULL
 	      || (eh->oh != NULL
-		  && eh->oh->elf.plt.plist != NULL)))
+		  && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
 	{
 	  ret = 1;
 	  break;
@@ -10000,7 +10039,7 @@ ppc64_elf_size_stubs (bfd *output_bfd,
 			 use the func descriptor sym instead if it is
 			 defined.  */
 		      if (hash->elf.root.root.string[0] == '.'
-			  && (fdh = get_fdh (hash, htab)) != NULL)
+			  && (fdh = lookup_fdh (hash, htab)) != NULL)
 			{
 			  if (fdh->elf.root.type == bfd_link_hash_defined
 			      || fdh->elf.root.type == bfd_link_hash_defweak)
@@ -11188,10 +11227,12 @@ ppc64_elf_relocate_section (bfd *output_
 	     base pointer.  */
 	  stub_entry = NULL;
 	  fdh = h;
-	  if (((h != NULL
-		&& (((fdh = h->oh) != NULL
-		     && fdh->elf.plt.plist != NULL)
-		    || (fdh = h)->elf.plt.plist != NULL))
+	  if (h != NULL
+	      && h->oh != NULL
+	      && h->oh->is_func_descriptor)
+	    fdh = ppc_follow_link (h->oh);
+	  if (((fdh != NULL
+		&& fdh->elf.plt.plist != NULL)
 	       || (sec != NULL
 		   && sec->output_section != NULL
 		   && sec->id <= htab->top_id
Index: ld/testsuite/ld-powerpc/tlsso.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/tlsso.d,v
retrieving revision 1.7
diff -u -p -r1.7 tlsso.d
--- ld/testsuite/ld-powerpc/tlsso.d	6 Nov 2007 13:49:19 -0000	1.7
+++ ld/testsuite/ld-powerpc/tlsso.d	17 Sep 2009 06:10:59 -0000
@@ -8,7 +8,7 @@
 
 Disassembly of section \.text:
 
-.* <\.__tls_get_addr>:
+.*:
 .*	f8 41 00 28 	std     r2,40\(r1\)
 .*	e9 62 80 78 	ld      r11,-32648\(r2\)
 .*	7d 69 03 a6 	mtctr   r11
@@ -18,16 +18,16 @@ Disassembly of section \.text:
 
 .* <_start>:
 .*	38 62 80 20 	addi    r3,r2,-32736
-.*	4b ff ff e5 	bl      .* <\.__tls_get_addr>
+.*	4b ff ff e5 	bl      .*
 .*	e8 41 00 28 	ld      r2,40\(r1\)
 .*	38 62 80 50 	addi    r3,r2,-32688
-.*	4b ff ff d9 	bl      .* <\.__tls_get_addr>
+.*	4b ff ff d9 	bl      .*
 .*	e8 41 00 28 	ld      r2,40\(r1\)
 .*	38 62 80 38 	addi    r3,r2,-32712
-.*	4b ff ff cd 	bl      .* <\.__tls_get_addr>
+.*	4b ff ff cd 	bl      .*
 .*	e8 41 00 28 	ld      r2,40\(r1\)
 .*	38 62 80 50 	addi    r3,r2,-32688
-.*	4b ff ff c1 	bl      .* <\.__tls_get_addr>
+.*	4b ff ff c1 	bl      .*
 .*	e8 41 00 28 	ld      r2,40\(r1\)
 .*	39 23 80 40 	addi    r9,r3,-32704
 .*	3d 23 00 00 	addis   r9,r3,0
@@ -40,10 +40,10 @@ Disassembly of section \.text:
 .*	3d 2d 00 00 	addis   r9,r13,0
 .*	99 49 00 00 	stb     r10,0\(r9\)
 .*	38 62 80 08 	addi    r3,r2,-32760
-.*	4b ff ff 8d 	bl      .* <\.__tls_get_addr>
+.*	4b ff ff 8d 	bl      .*
 .*	e8 41 00 28 	ld      r2,40\(r1\)
 .*	38 62 80 50 	addi    r3,r2,-32688
-.*	4b ff ff 81 	bl      .* <\.__tls_get_addr>
+.*	4b ff ff 81 	bl      .*
 .*	e8 41 00 28 	ld      r2,40\(r1\)
 .*	f9 43 80 08 	std     r10,-32760\(r3\)
 .*	3d 23 00 00 	addis   r9,r3,0
Index: ld/testsuite/ld-powerpc/tlsso.r
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/tlsso.r,v
retrieving revision 1.22
diff -u -p -r1.22 tlsso.r
--- ld/testsuite/ld-powerpc/tlsso.r	6 Nov 2007 13:49:19 -0000	1.22
+++ ld/testsuite/ld-powerpc/tlsso.r	17 Sep 2009 06:10:59 -0000
@@ -110,7 +110,7 @@ Symbol table '\.symtab' contains [0-9]+ 
 .* TLS +LOCAL +DEFAULT +7 le4
 .* TLS +LOCAL +DEFAULT +7 le5
 .* OBJECT +LOCAL +HIDDEN +ABS _DYNAMIC
-.* NOTYPE +LOCAL +DEFAULT +6 \.__tls_get_addr
+.* NOTYPE +LOCAL +DEFAULT +UND \.__tls_get_addr
 .* TLS +GLOBAL DEFAULT +UND gd
 .* TLS +GLOBAL DEFAULT +8 le0
 .* NOTYPE +GLOBAL DEFAULT +UND __tls_get_addr
Index: ld/testsuite/ld-powerpc/tlstocso.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/tlstocso.d,v
retrieving revision 1.6
diff -u -p -r1.6 tlstocso.d
--- ld/testsuite/ld-powerpc/tlstocso.d	13 Aug 2007 00:20:59 -0000	1.6
+++ ld/testsuite/ld-powerpc/tlstocso.d	17 Sep 2009 06:10:59 -0000
@@ -8,7 +8,7 @@
 
 Disassembly of section \.text:
 
-.* <\.__tls_get_addr>:
+.*:
 .*	f8 41 00 28 	std     r2,40\(r1\)
 .*	e9 62 80 70 	ld      r11,-32656\(r2\)
 .*	7d 69 03 a6 	mtctr   r11
@@ -18,16 +18,16 @@ Disassembly of section \.text:
 
 .* <_start>:
 .*	38 62 80 08 	addi    r3,r2,-32760
-.*	4b ff ff e5 	bl      .* <\.__tls_get_addr>
+.*	4b ff ff e5 	bl      .*
 .*	e8 41 00 28 	ld      r2,40\(r1\)
 .*	38 62 80 18 	addi    r3,r2,-32744
-.*	4b ff ff d9 	bl      .* <\.__tls_get_addr>
+.*	4b ff ff d9 	bl      .*
 .*	e8 41 00 28 	ld      r2,40\(r1\)
 .*	38 62 80 28 	addi    r3,r2,-32728
-.*	4b ff ff cd 	bl      .* <\.__tls_get_addr>
+.*	4b ff ff cd 	bl      .*
 .*	e8 41 00 28 	ld      r2,40\(r1\)
 .*	38 62 80 38 	addi    r3,r2,-32712
-.*	4b ff ff c1 	bl      .* <\.__tls_get_addr>
+.*	4b ff ff c1 	bl      .*
 .*	e8 41 00 28 	ld      r2,40\(r1\)
 .*	39 23 80 40 	addi    r9,r3,-32704
 .*	3d 23 00 00 	addis   r9,r3,0
Index: ld/testsuite/ld-powerpc/tlstocso.r
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/tlstocso.r,v
retrieving revision 1.20
diff -u -p -r1.20 tlstocso.r
--- ld/testsuite/ld-powerpc/tlstocso.r	30 Sep 2007 01:33:15 -0000	1.20
+++ ld/testsuite/ld-powerpc/tlstocso.r	17 Sep 2009 06:10:59 -0000
@@ -106,7 +106,7 @@ Symbol table '\.symtab' contains [0-9]+ 
 .* TLS +LOCAL +DEFAULT +7 le5
 .* NOTYPE +LOCAL +DEFAULT +11 \.Lie0
 .* OBJECT +LOCAL +HIDDEN +ABS _DYNAMIC
-.* NOTYPE +LOCAL +DEFAULT +6 \.__tls_get_addr
+.* NOTYPE +LOCAL +DEFAULT +UND \.__tls_get_addr
 .* TLS +GLOBAL DEFAULT +UND gd
 .* TLS +GLOBAL DEFAULT +8 le0
 .* NOTYPE +GLOBAL DEFAULT +UND __tls_get_addr

-- 
Alan Modra
Australia Development Lab, IBM


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