PR ld/15270
authorAlan Modra <amodra@gmail.com>
Fri, 22 Mar 2013 23:35:55 +0000 (23:35 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 22 Mar 2013 23:35:55 +0000 (23:35 +0000)
* elflink.c (elf_link_add_object_symbols): Don't set def_regular
or ref_regular for BFD_PLUGIN owned syms, or have them affect
def_dynamic/ref_dynamic.
(_bfd_elf_fix_symbol_flags): Don't set def_regular for BFD_PLUGIN
owned syms.

bfd/ChangeLog
bfd/elflink.c

index a57684d..16b2b1b 100644 (file)
@@ -1,3 +1,12 @@
+2013-03-23  Alan Modra  <amodra@gmail.com>
+
+       PR ld/15270
+       * elflink.c (elf_link_add_object_symbols): Don't set def_regular
+       or ref_regular for BFD_PLUGIN owned syms, or have them affect
+       def_dynamic/ref_dynamic.
+       (_bfd_elf_fix_symbol_flags): Don't set def_regular for BFD_PLUGIN
+       owned syms.
+
 2013-03-22  David S. Miller  <davem@davemloft.net>
 
        * elfxx-sparc.c (_bfd_sparc_elf_merge_private_bfd_data): Set type of
index fa805bc..be53ca3 100644 (file)
@@ -2491,7 +2491,7 @@ _bfd_elf_fix_symbol_flags (struct elf_link_hash_entry *h,
       && !h->def_regular
       && h->ref_regular
       && !h->def_dynamic
-      && (h->root.u.def.section->owner->flags & DYNAMIC) == 0)
+      && (h->root.u.def.section->owner->flags & (DYNAMIC | BFD_PLUGIN)) == 0)
     h->def_regular = 1;
 
   /* If -Bsymbolic was used (which means to bind references to global
@@ -4361,7 +4361,12 @@ error_free_dyn:
             is one which is referenced or defined by both a regular
             object and a shared object.  */
          dynsym = FALSE;
-         if (! dynamic)
+
+         /* Plugin symbols aren't normal.  Don't set def_regular or
+            ref_regular for them, nor make them dynamic.  */
+         if ((abfd->flags & BFD_PLUGIN) != 0)
+           ;
+         else if (! dynamic)
            {
              if (! definition)
                {
@@ -4415,10 +4420,6 @@ error_free_dyn:
          if (definition && (sec->flags & SEC_DEBUGGING) && !info->relocatable)
            dynsym = FALSE;
 
-         /* Nor should we make plugin symbols dynamic.  */
-         if ((abfd->flags & BFD_PLUGIN) != 0)
-           dynsym = FALSE;
-
          if (definition)
            {
              h->target_internal = isym->st_target_internal;