PR binutils/3874

* elf32-avr.c (avr_link_hash_table): Check to make sure that the hash table was created by elf32_avr_link_hash_table_create before using it.
  (elf32_avr_link_hash_newfunc): New function.  Just pass the call through to _bfd_elf_link_hash_newfunc.
  (elf32_avr_link_hash_table_create): Use elf32_avr_link_hash_newfunc instead of _bfd_elf_link_hash_newfunc.
  (elf32_avr_relocate_section): Check for the hash table pointer being NULL.
  (elf32_avr_relax_section, avr_build_one_stub, elf32_avr_setup_params, get_local_syms, elf32_avr_size_stubs, elf32_avr_build_stubs): Likewise.
This commit is contained in:
Nick Clifton 2007-01-25 09:32:41 +00:00
parent 5f40043739
commit 64ee10b619
2 changed files with 62 additions and 18 deletions

View File

@ -1,3 +1,20 @@
2007-01-25 Nick Clifton <nickc@redhat.com>
PR binutils/3874
* elf32-avr.c (avr_link_hash_table): Check to make sure that the
hash table was created by elf32_avr_link_hash_table_create before
using it.
(elf32_avr_link_hash_newfunc): New function. Just pass the call
through to _bfd_elf_link_hash_newfunc.
(elf32_avr_link_hash_table_create): Use
elf32_avr_link_hash_newfunc instead of
_bfd_elf_link_hash_newfunc.
(elf32_avr_relocate_section): Check for the hash table pointer
being NULL.
(elf32_avr_relax_section, avr_build_one_stub,
elf32_avr_setup_params, get_local_syms, elf32_avr_size_stubs,
elf32_avr_build_stubs): Likewise.
2007-01-16 H.J. Lu <hongjiu.lu@intel.com>
PR ld/3831

View File

@ -1,5 +1,5 @@
/* AVR-specific support for 32-bit ELF
Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2006
Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007
Free Software Foundation, Inc.
Contributed by Denis Chertykov <denisc@overta.ru>
@ -103,7 +103,9 @@ struct elf32_avr_link_hash_table
/* Various hash macros and functions. */
#define avr_link_hash_table(p) \
((struct elf32_avr_link_hash_table *) ((p)->hash))
/* PR 3874: Check that we have an AVR style hash table before using it. */\
((p)->hash->table.newfunc != elf32_avr_link_hash_newfunc ? NULL : \
((struct elf32_avr_link_hash_table *) ((p)->hash)))
#define avr_stub_hash_entry(ent) \
((struct elf32_avr_stub_hash_entry *)(ent))
@ -587,6 +589,18 @@ stub_hash_newfunc (struct bfd_hash_entry *entry,
return entry;
}
/* This function is just a straight passthrough to the real
function in linker.c. Its prupose is so that its address
can be compared inside the avr_link_hash_table macro. */
static struct bfd_hash_entry *
elf32_avr_link_hash_newfunc (struct bfd_hash_entry * entry,
struct bfd_hash_table * table,
const char * string)
{
return _bfd_elf_link_hash_newfunc (entry, table, string);
}
/* Create the derived linker hash table. The AVR ELF port uses the derived
hash table to keep information specific to the AVR ELF linker (without
using static variables). */
@ -602,7 +616,7 @@ elf32_avr_link_hash_table_create (bfd *abfd)
return NULL;
if (!_bfd_elf_link_hash_table_init (&htab->etab, abfd,
_bfd_elf_link_hash_newfunc,
elf32_avr_link_hash_newfunc,
sizeof (struct elf_link_hash_entry)))
{
free (htab);
@ -1139,7 +1153,7 @@ elf32_avr_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
Elf_Internal_Rela * relend;
struct elf32_avr_link_hash_table * htab = avr_link_hash_table (info);
if (info->relocatable)
if (info == NULL || info->relocatable)
return TRUE;
symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
@ -1560,6 +1574,8 @@ elf32_avr_relax_section (bfd *abfd,
struct elf32_avr_link_hash_table *htab;
htab = avr_link_hash_table (link_info);
if (htab == NULL)
return FALSE;
/* Assume nothing changes. */
*again = FALSE;
@ -2364,6 +2380,8 @@ avr_build_one_stub (struct bfd_hash_entry *bh, void *in_arg)
info = (struct bfd_link_info *) in_arg;
htab = avr_link_hash_table (info);
if (htab == NULL)
return FALSE;
target = hsh->target_value;
@ -2454,8 +2472,10 @@ elf32_avr_setup_params (struct bfd_link_info *info,
bfd_vma pc_wrap_around,
bfd_boolean call_ret_replacement)
{
struct elf32_avr_link_hash_table *htab = avr_link_hash_table(info);
struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
if (htab == NULL)
return;
htab->stub_sec = avr_stub_section;
htab->stub_bfd = avr_stub_bfd;
htab->no_stubs = no_stubs;
@ -2485,7 +2505,7 @@ elf32_avr_setup_section_lists (bfd *output_bfd,
bfd_size_type amt;
struct elf32_avr_link_hash_table *htab = avr_link_hash_table(info);
if (htab->no_stubs)
if (htab == NULL || htab->no_stubs)
return 0;
/* Count the number of input BFDs and find the top input section id. */
@ -2547,6 +2567,9 @@ get_local_syms (bfd *input_bfd, struct bfd_link_info *info)
Elf_Internal_Sym *local_syms, **all_local_syms;
struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info);
if (htab == NULL)
return -1;
/* We want to read in symbol extension records only once. To do this
we need to read in the local symbols in parallel and save them for
later use; so hold pointers to the local symbols in an array. */
@ -2596,21 +2619,23 @@ elf32_avr_size_stubs (bfd *output_bfd,
struct bfd_link_info *info,
bfd_boolean is_prealloc_run)
{
struct elf32_avr_link_hash_table *htab;
int stub_changed = 0;
struct elf32_avr_link_hash_table *htab;
int stub_changed = 0;
htab = avr_link_hash_table (info);
htab = avr_link_hash_table (info);
if (htab == NULL)
return FALSE;
/* At this point we initialize htab->vector_base
To the start of the text output section. */
htab->vector_base = htab->stub_sec->output_section->vma;
/* At this point we initialize htab->vector_base
To the start of the text output section. */
htab->vector_base = htab->stub_sec->output_section->vma;
if (get_local_syms (info->input_bfds, info))
{
if (htab->all_local_syms)
goto error_ret_free_local;
return FALSE;
}
if (get_local_syms (info->input_bfds, info))
{
if (htab->all_local_syms)
goto error_ret_free_local;
return FALSE;
}
if (ADD_DUMMY_STUBS_FOR_DEBUGGING)
{
@ -2856,6 +2881,8 @@ elf32_avr_build_stubs (struct bfd_link_info *info)
bfd_size_type total_size = 0;
htab = avr_link_hash_table (info);
if (htab == NULL)
return FALSE;
/* In case that there were several stub sections: */
for (stub_sec = htab->stub_bfd->sections;