2004-07-30 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 30 Jul 2004 15:37:04 +0000 (15:37 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 30 Jul 2004 15:37:04 +0000 (15:37 +0000)
    Nick Clifton  <nickc@redhat.com>

PR 290
* bfd.c (_bfd_default_error_handler): Make it global.

* elf-bfd.h (elf_backend_data): Add link_order_error_handler.

* elf.c (assign_section_numbers): Cope gracefully with sections
which have SHF_LINK_ORDER set but no sh_link set up.
* elflink.c (elf_get_linked_section_vma): Likewise.

* elfxx-ia64.c (elf_backend_link_order_error_handler): New. Set
it to NULL.

* elfxx-target.h (elf_backend_link_order_error_handler): New.
Set it to _bfd_default_error_handler.
(elfNN_bed): Add elf_backend_link_order_error_handler.

* libbfd-in.h (_bfd_default_error_handler): New.

* libbfd.h: Regenerated.

bfd/ChangeLog
bfd/bfd.c
bfd/elf-bfd.h
bfd/elf.c
bfd/elflink.c
bfd/elfxx-ia64.c
bfd/elfxx-target.h
bfd/libbfd-in.h
bfd/libbfd.h

index 2a717386972f4d1a65da22807563c2f354665bc6..4415814b66ccb8e7db4dd6eefec053c9331fc7fb 100644 (file)
@@ -1,3 +1,26 @@
+2004-07-30  H.J. Lu  <hongjiu.lu@intel.com>
+           Nick Clifton  <nickc@redhat.com>
+
+       PR 290
+       * bfd.c (_bfd_default_error_handler): Make it global.
+
+       * elf-bfd.h (elf_backend_data): Add link_order_error_handler.
+
+       * elf.c (assign_section_numbers): Cope gracefully with sections
+       which have SHF_LINK_ORDER set but no sh_link set up.
+       * elflink.c (elf_get_linked_section_vma): Likewise.
+
+       * elfxx-ia64.c (elf_backend_link_order_error_handler): New. Set
+       it to NULL.
+
+       * elfxx-target.h (elf_backend_link_order_error_handler): New.
+       Set it to _bfd_default_error_handler.
+       (elfNN_bed): Add elf_backend_link_order_error_handler.
+
+       * libbfd-in.h (_bfd_default_error_handler): New.
+
+       * libbfd.h: Regenerated.
+
 2004-07-30  Jakub Jelinek  <jakub@redhat.com>
 
        * archures.c (bfd_mach_sparc_64bit_p): Define.
index 209b1b681a74f50e898c0b1c5acf71176714d0d3..f67e85c44b773afd763c19ff8e66aa293668fd0a 100644 (file)
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -408,7 +408,7 @@ static const char *_bfd_error_program_name;
 
 /* This is the default routine to handle BFD error messages.  */
 
-static void
+void
 _bfd_default_error_handler (const char *s, ...)
 {
   va_list p;
index 851b39302d3387ff1a07a29a9b9793030255a2eb..e1a0075c4b4aace12d839de1df867ad3c2028276 100644 (file)
@@ -925,6 +925,9 @@ struct elf_backend_data
      see elf.c.  */
   bfd_vma (*plt_sym_val) (bfd_vma, const asection *, const arelent *);
 
+  /* Used to handle bad SHF_LINK_ORDER input.  */
+  bfd_error_handler_type link_order_error_handler;
+
   /* Name of the PLT relocation section.  */
   const char *relplt_name;
 
index 752df66502bcff6822e56f364f19d633a960c7f1..7e00c04acb7ab0ccf44e1a5bef1d464ff82503f1 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -2885,10 +2885,32 @@ assign_section_numbers (bfd *abfd)
                      int elfsec
                        = _bfd_elf_section_from_bfd_section (s->owner, s);
                      elfsec = elf_shdrp[elfsec]->sh_link;
-                     BFD_ASSERT (elfsec != 0);
-                     s = elf_shdrp[elfsec]->bfd_section->output_section;
-                     BFD_ASSERT (s != NULL);
-                     d->this_hdr.sh_link = elf_section_data (s)->this_idx;
+                     /* PR 290:
+                        The Intel C compiler generates SHT_IA_64_UNWIND with
+                        SHF_LINK_ORDER.  But it doesn't set theh sh_link or
+                        sh_info fields.  Hence we could get the situation
+                        where elfsec is 0.  */
+                     if (elfsec == 0)
+                       {
+                         const struct elf_backend_data *bed
+                           = get_elf_backend_data (abfd);
+                         if (bed->link_order_error_handler)
+                           {
+                             char *name = bfd_get_section_ident (s);
+                             bed->link_order_error_handler
+                               (_("%s: warning: sh_link not set for section `%s'"),
+                                bfd_archive_filename (abfd),
+                                name ? name : s->name);
+                             if (name)
+                               free (name);
+                           }
+                       }
+                     else
+                       {
+                         s = elf_shdrp[elfsec]->bfd_section->output_section;
+                         BFD_ASSERT (s != NULL);
+                         d->this_hdr.sh_link = elf_section_data (s)->this_idx;
+                       }
                      break;
                    }
                }
index e3411826f962961a0f1235a10e97019a4cb0cf07..5eb0c9352472bd5010933ae066657edca745e541 100644 (file)
@@ -7220,8 +7220,32 @@ elf_get_linked_section_vma (struct bfd_link_order *p)
   elf_shdrp = elf_elfsections (s->owner);
   elfsec = _bfd_elf_section_from_bfd_section (s->owner, s);
   elfsec = elf_shdrp[elfsec]->sh_link;
-  s = elf_shdrp[elfsec]->bfd_section;
-  return s->output_section->vma + s->output_offset;
+  /* PR 290:
+     The Intel C compiler generates SHT_IA_64_UNWIND with
+     SHF_LINK_ORDER.  But it doesn't set theh sh_link or
+     sh_info fields.  Hence we could get the situation
+     where elfsec is 0.  */
+  if (elfsec == 0)
+    {
+      const struct elf_backend_data *bed
+       = get_elf_backend_data (s->owner);
+      if (bed->link_order_error_handler)
+       {
+         char *name = bfd_get_section_ident (s);
+         bed->link_order_error_handler
+           (_("%s: warning: sh_link not set for section `%s'"),
+            bfd_archive_filename (s->owner),
+            name ? name : s->name);
+         if (name)
+           free (name);
+       }
+      return 0;
+    }
+  else
+    {
+      s = elf_shdrp[elfsec]->bfd_section;
+      return s->output_section->vma + s->output_offset;
+    }
 }
 
 
index 614d1d8a3d5824d79402a068108aa3b23febfa8f..8ccf7f70b9b980cb7e4c3881891e88ea96903085 100644 (file)
@@ -4987,6 +4987,13 @@ elfNN_hpux_backend_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
 #define elf_backend_rela_normal                1
 #define elf_backend_special_sections   elfNN_ia64_special_sections
 
+/* FIXME: PR 290: The Intel C compiler generates SHT_IA_64_UNWIND with
+   SHF_LINK_ORDER. But it doesn't set theh sh_link or sh_info fields.
+   We don't want to flood users with so many error messages. We turn
+   off the warning for now. It will be turned on later when the Intel
+   compiler is fixed.   */
+#define elf_backend_link_order_error_handler NULL
+
 #include "elfNN-target.h"
 
 /* HPUX-specific vectors.  */
index b4aa171c9fe4b370048a6d346bd6a8bb0ac22c1a..0273f5377b4dd52f3755ddbdcf5b024622579fd2 100644 (file)
 #define elf_backend_sign_extend_vma 0
 #endif
 
+#ifndef elf_backend_link_order_error_handler
+#define elf_backend_link_order_error_handler _bfd_default_error_handler
+#endif
+
 extern const struct elf_size_info _bfd_elfNN_size_info;
 
 #ifndef INCLUDED_TARGET_FILE
@@ -555,6 +559,7 @@ static const struct elf_backend_data elfNN_bed =
   elf_backend_ecoff_debug_swap,
   elf_backend_bfd_from_remote_memory,
   elf_backend_plt_sym_val,
+  elf_backend_link_order_error_handler,
   elf_backend_relplt_name,
   ELF_MACHINE_ALT1,
   ELF_MACHINE_ALT2,
index dd7cca2cc81903b70fcfd051244b80ea355c970c..826aaf473fb9fb51be0098989147cca3890fe7e5 100644 (file)
@@ -91,6 +91,7 @@ extern void *bfd_realloc
 extern void *bfd_zmalloc
   (bfd_size_type);
 
+extern void _bfd_default_error_handler (const char *s, ...);
 extern bfd_error_handler_type _bfd_error_handler;
 
 /* These routines allocate and free things on the BFD's objalloc.  */
index f85ca40294027afffe614c1255bdb8fcefc8ec3a..f3bd57af4d4bf5749b2fa433f5dc8af967c5fa17 100644 (file)
@@ -96,6 +96,7 @@ extern void *bfd_realloc
 extern void *bfd_zmalloc
   (bfd_size_type);
 
+extern void _bfd_default_error_handler (const char *s, ...);
 extern bfd_error_handler_type _bfd_error_handler;
 
 /* These routines allocate and free things on the BFD's objalloc.  */