From 7cfbbe4f1a726be3f03afce51b5a719ff9e047b0 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 30 Jul 2004 15:37:04 +0000 Subject: [PATCH] 2004-07-30 H.J. Lu Nick Clifton 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 | 23 +++++++++++++++++++++++ bfd/bfd.c | 2 +- bfd/elf-bfd.h | 3 +++ bfd/elf.c | 30 ++++++++++++++++++++++++++---- bfd/elflink.c | 28 ++++++++++++++++++++++++++-- bfd/elfxx-ia64.c | 7 +++++++ bfd/elfxx-target.h | 5 +++++ bfd/libbfd-in.h | 1 + bfd/libbfd.h | 1 + 9 files changed, 93 insertions(+), 7 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2a7173869..4415814b6 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,26 @@ +2004-07-30 H.J. Lu + Nick Clifton + + 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 * archures.c (bfd_mach_sparc_64bit_p): Define. diff --git a/bfd/bfd.c b/bfd/bfd.c index 209b1b681..f67e85c44 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 851b39302..e1a0075c4 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 752df6650..7e00c04ac 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 e3411826f..5eb0c9352 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 614d1d8a3..8ccf7f70b 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 b4aa171c9..0273f5377 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 dd7cca2cc..826aaf473 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 f85ca4029..f3bd57af4 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. */ -- 2.11.4.GIT