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.
This commit is contained in:
parent
ddc9cd0f63
commit
185d09adc3
9 changed files with 93 additions and 7 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
30
bfd/elf.c
30
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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. */
|
||||
|
|
Loading…
Reference in a new issue