RFC: Fix ia64 visibility

H. J. Lu hjl@lucon.org
Thu May 8 05:51:00 GMT 2003


On Wed, May 07, 2003 at 04:17:15PM -0700, Richard Henderson wrote:
> On Wed, May 07, 2003 at 04:15:08PM -0700, H. J. Lu wrote:
> > It is an optimization for calling directly to protected functions. In
> > that case, we don't need PLT nor function descriptors. It is the same
> > as calling an internal function.
> 
> Certainly.
> 
> > But we can't do it for function
> > descriptors of protected functions. That check is based on relocation
> > type, not just symbol alone.
> 
> Because ld.so is going to allocate it, correct?

Yes.

> 
> > Another way to do it is to pass reloction type to
> > elfNN_ia64_dynamic_symbol_p so that it has enough info to do
> > the right thing.
> 
> Eh.  I'd prefer a different function.  It can do little else
> besides checking the reloc plus calling elfNN_ia64_dynamic_symbol_p.
> 
> > I can submit a new patch if it is preferred.

I didn't create a new function since it isn't used anywhere else.
Instead, I addded a new variable and set it based on the return
value of elfNN_ia64_dynamic_symbol_p and symbol visibility.


H.J.
-------------- next part --------------
2003-05-07  H.J. Lu <hongjiu.lu@intel.com>

	* elfxx-ia64.c (_bfd_elf_link_hash_hide_symbol): Also clear the
	want_plt field.
	(elfNN_ia64_relocate_section): Don't do dynamic symbol lookup
	for symbols with non-default visibility.

--- bfd/elfxx-ia64.c.ia64	2003-05-05 08:27:08.000000000 -0700
+++ bfd/elfxx-ia64.c	2003-05-07 22:46:17.000000000 -0700
@@ -1792,7 +1792,10 @@ elfNN_ia64_hash_hide_symbol (info, xh, f
   _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local);
 
   for (dyn_i = h->info; dyn_i; dyn_i = dyn_i->next)
-    dyn_i->want_plt2 = 0;
+    {
+      dyn_i->want_plt2 = 0;
+      dyn_i->want_plt = 0;
+    }
 }
 
 /* Create the derived linker hash table.  The IA-64 ELF port uses this
@@ -3890,6 +3893,7 @@ elfNN_ia64_relocate_section (output_bfd,
       asection *sym_sec;
       bfd_byte *hit_addr;
       bfd_boolean dynamic_symbol_p;
+      bfd_boolean local_symbol_p;
       bfd_boolean undef_weak_ref;
 
       r_type = ELFNN_R_TYPE (rel->r_info);
@@ -4001,6 +4005,11 @@ elfNN_ia64_relocate_section (output_bfd,
       hit_addr = contents + rel->r_offset;
       value += rel->r_addend;
       dynamic_symbol_p = elfNN_ia64_dynamic_symbol_p (h, info);
+      /* Is this symbol locally defined? A protected symbol is locallly
+	 defined. But its function descriptor may not. Use it with
+	 caution.  */
+      local_symbol_p = (! dynamic_symbol_p
+			|| ELF_ST_VISIBILITY (h->other) != STV_DEFAULT);
 
       switch (r_type)
 	{
@@ -4033,7 +4042,7 @@ elfNN_ia64_relocate_section (output_bfd,
 	      /* If we don't need dynamic symbol lookup, find a
 		 matching RELATIVE relocation.  */
 	      dyn_r_type = r_type;
-	      if (dynamic_symbol_p)
+	      if (! local_symbol_p)
 		{
 		  dynindx = h->dynindx;
 		  addend = rel->r_addend;
@@ -4362,7 +4371,7 @@ elfNN_ia64_relocate_section (output_bfd,
 
 	      /* If we don't need dynamic symbol lookup, install two
 		 RELATIVE relocations.  */
-	      if (! dynamic_symbol_p)
+	      if (local_symbol_p)
 		{
 		  unsigned int dyn_r_type;
 


More information about the Binutils mailing list