2005-12-07 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 7 Dec 2005 19:21:44 +0000 (19:21 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 7 Dec 2005 19:21:44 +0000 (19:21 +0000)
    Andreas Schwab  <schwab@suse.de>

PR binutils/1991
* elf.c (assign_section_numbers): Always use the output section
when setting up sh_link for SHF_LINK_ORDER.

bfd/ChangeLog
bfd/elf.c

index e34e2db..3051cdc 100644 (file)
@@ -1,3 +1,10 @@
+2005-12-07  H.J. Lu  <hongjiu.lu@intel.com>
+           Andreas Schwab  <schwab@suse.de>
+
+       PR binutils/1991
+       * elf.c (assign_section_numbers): Always use the output section
+       when setting up sh_link for SHF_LINK_ORDER.
+
 2005-12-07  Thiemo Seufer  <ths@networkno.de>
            H.J. Lu  <hongjiu.lu@intel.com>
 
index ea86c3e..644ac6d 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -3053,10 +3053,10 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
          s = elf_linked_to_section (sec);
          if (s)
            {
+             /* elf_linked_to_section points to the input section.  */
              if (link_info != NULL)
                {
-                 /* For linker, elf_linked_to_section points to the
-                    input section.  */
+                 /* Check discarded linkonce section.  */
                  if (elf_discarded_section (s))
                    {
                      asection *kept;
@@ -3074,9 +3074,26 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
                        }
                      s = kept;
                    }
+               }
+             if (link_info != NULL)
+               {
+                 /* Handle linker.  */
                  s = s->output_section;
                  BFD_ASSERT (s != NULL);
                }
+             else
+               {
+                 /* Handle objcopy. */
+                 if (s->output_section == NULL)
+                   {
+                     (*_bfd_error_handler)
+                       (_("%B: sh_link of section `%A' points to removed section `%A' of `%B'"),
+                        abfd, d->this_hdr.bfd_section, s, s->owner);
+                     bfd_set_error (bfd_error_bad_value);
+                     return FALSE;
+                   }
+                 s = s->output_section;
+               }
              d->this_hdr.sh_link = elf_section_data (s)->this_idx;
            }
          else