Fix ia64-linux fortran common linking problem.
authorJim Wilson <wilson@tuliptree.org>
Thu, 5 Jul 2001 22:40:16 +0000 (22:40 +0000)
committerJim Wilson <wilson@tuliptree.org>
Thu, 5 Jul 2001 22:40:16 +0000 (22:40 +0000)
* linker.c (_bfd_generic_link_add_one_symbol, case BIG): Use
the section of the bigger symbol.

bfd/ChangeLog
bfd/linker.c

index ec94ce98e2e788437363d5103ee4996138251693..b4937f55e78f51a4d5b6e0a743d3a2dd34ac509f 100644 (file)
@@ -1,5 +1,8 @@
 2001-07-05  Jim Wilson  <wilson@redhat.com>
 
+       * linker.c (_bfd_generic_link_add_one_symbol, case BIG): Use
+       the section of the bigger symbol.
+
        * syms.c (bfd_is_local_label): Return false if BSF_SECTION_SYM.
 
 2001-07-05  Nick Clifton  <nickc@cambridge.redhat.com>
index 087728948903f220f9b94e1536383ac7b88ee849..54781868e7ab2c837be64f301c5326027abada48 100644 (file)
@@ -1698,7 +1698,7 @@ _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section, value,
        case BIG:
          /* We have found a common definition for a symbol which
             already had a common definition.  Use the maximum of the
-            two sizes.  */
+            two sizes, and use the section required by the larger symbol.  */
          BFD_ASSERT (h->type == bfd_link_hash_common);
          if (! ((*info->callbacks->multiple_common)
                 (info, h->root.string,
@@ -1717,6 +1717,25 @@ _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section, value,
              if (power > 4)
                power = 4;
              h->u.c.p->alignment_power = power;
+
+             /* Some systems have special treatment for small commons,
+                hence we want to select the section used by the larger
+                symbol.  This makes sure the symbol does not go in a
+                small common section if it is now too large.  */
+             if (section == bfd_com_section_ptr)
+               {
+                 h->u.c.p->section
+                   = bfd_make_section_old_way (abfd, "COMMON");
+                 h->u.c.p->section->flags = SEC_ALLOC;
+               }
+             else if (section->owner != abfd)
+               {
+                 h->u.c.p->section
+                   = bfd_make_section_old_way (abfd, section->name);
+                 h->u.c.p->section->flags = SEC_ALLOC;
+               }
+             else
+               h->u.c.p->section = section;
            }
          break;