aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog23
-rw-r--r--bfd/bfd.c2
-rw-r--r--bfd/elf-bfd.h3
-rw-r--r--bfd/elf.c30
-rw-r--r--bfd/elflink.c28
-rw-r--r--bfd/elfxx-ia64.c7
-rw-r--r--bfd/elfxx-target.h5
-rw-r--r--bfd/libbfd-in.h1
-rw-r--r--bfd/libbfd.h1
9 files changed, 93 insertions, 7 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 2a71738..4415814 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/bfd.c b/bfd/bfd.c
index 209b1b6..f67e85c 100644
--- 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;
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 851b393..e1a0075 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -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;
diff --git a/bfd/elf.c b/bfd/elf.c
index 752df66..7e00c04 100644
--- 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;
}
}
diff --git a/bfd/elflink.c b/bfd/elflink.c
index e341182..5eb0c93 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -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;
+ }
}
diff --git a/bfd/elfxx-ia64.c b/bfd/elfxx-ia64.c
index 614d1d8..8ccf7f7 100644
--- a/bfd/elfxx-ia64.c
+++ b/bfd/elfxx-ia64.c
@@ -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. */
diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h
index b4aa171..0273f53 100644
--- a/bfd/elfxx-target.h
+++ b/bfd/elfxx-target.h
@@ -491,6 +491,10 @@
#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,
diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h
index dd7cca2..826aaf4 100644
--- a/bfd/libbfd-in.h
+++ b/bfd/libbfd-in.h
@@ -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. */
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
index f85ca40..f3bd57a 100644
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -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. */