Add tests of return values from bfd function calls

This commit is contained in:
Nick Clifton
2000-10-16 19:08:45 +00:00
parent 710c2d976f
commit 6e45556a36
2 changed files with 64 additions and 28 deletions

View File

@ -1,3 +1,8 @@
2000-10-16 Nick Clifton <nickc@redhat.com>
* emultempl/pe.em (_after_open): Add tests of return values from
bfd functions. Emit appropriate error messages if necessary.
2000-10-13 Nick Clifton <nickc@redhat.com> 2000-10-13 Nick Clifton <nickc@redhat.com>
* emultempl/pe.em (_after_open): Delete 'is2' and 'nsyms' * emultempl/pe.em (_after_open): Delete 'is2' and 'nsyms'

View File

@ -839,7 +839,8 @@ gld_${EMULATION_NAME}_after_open ()
{ {
int idata2 = 0, reloc_count=0, is_imp = 0; int idata2 = 0, reloc_count=0, is_imp = 0;
asection *sec; asection *sec;
/* See if this is an import library thunk */
/* See if this is an import library thunk. */
for (sec = is->the_bfd->sections; sec; sec = sec->next) for (sec = is->the_bfd->sections; sec; sec = sec->next)
{ {
if (strcmp (sec->name, ".idata\$2") == 0) if (strcmp (sec->name, ".idata\$2") == 0)
@ -848,53 +849,83 @@ gld_${EMULATION_NAME}_after_open ()
is_imp = 1; is_imp = 1;
reloc_count += sec->reloc_count; reloc_count += sec->reloc_count;
} }
if (is_imp && !idata2 && reloc_count) if (is_imp && !idata2 && reloc_count)
{ {
/* it is, look for the reference to head and see if it's /* It is, look for the reference to head and see if it's
from our own library */ from our own library. */
for (sec = is->the_bfd->sections; sec; sec = sec->next) for (sec = is->the_bfd->sections; sec; sec = sec->next)
{ {
int i; int i;
int symsize; long symsize;
long relsize;
asymbol **symbols; asymbol **symbols;
int relsize;
arelent **relocs; arelent **relocs;
int nrelocs; int nrelocs;
symsize = bfd_get_symtab_upper_bound (is->the_bfd); symsize = bfd_get_symtab_upper_bound (is->the_bfd);
symbols = (asymbol **) xmalloc (symsize); if (symsize < 1)
bfd_canonicalize_symtab (is->the_bfd, symbols); break;
relsize = bfd_get_reloc_upper_bound (is->the_bfd, sec); relsize = bfd_get_reloc_upper_bound (is->the_bfd, sec);
if (relsize < 1)
break;
symbols = (asymbol **) xmalloc (symsize);
symsize = bfd_canonicalize_symtab (is->the_bfd, symbols);
if (symsize < 0)
{
einfo ("%X%P: unable to process symbols: %E");
return;
}
relocs = (arelent **) xmalloc ((size_t) relsize); relocs = (arelent **) xmalloc ((size_t) relsize);
nrelocs = bfd_canonicalize_reloc (is->the_bfd, sec, nrelocs = bfd_canonicalize_reloc (is->the_bfd, sec,
relocs, symbols); relocs, symbols);
for (i=0; i<nrelocs; i++) if (nrelocs < 0)
{
free (relocs);
einfo ("%X%P: unable to process relocs: %E");
return;
}
for (i = 0; i < nrelocs; i++)
{ {
struct symbol_cache_entry *s; struct symbol_cache_entry *s;
struct bfd_link_hash_entry * blhe;
bfd *other_bfd;
char *n;
s = (relocs[i]->sym_ptr_ptr)[0]; s = (relocs[i]->sym_ptr_ptr)[0];
if (!s->flags & BSF_LOCAL)
{ if (s->flags & BSF_LOCAL)
/* thunk section with reloc to another bfd... */ continue;
struct bfd_link_hash_entry *blhe;
/* Thunk section with reloc to another bfd. */
blhe = bfd_link_hash_lookup (link_info.hash, blhe = bfd_link_hash_lookup (link_info.hash,
s->name, s->name,
false, false, true); false, false, true);
if (blhe && blhe->type == bfd_link_hash_defined)
{ if (blhe == NULL
bfd *other_bfd = blhe->u.def.section->owner; || blhe->type != bfd_link_hash_defined)
continue;
other_bfd = blhe->u.def.section->owner;
if (strcmp (is->the_bfd->my_archive->filename, if (strcmp (is->the_bfd->my_archive->filename,
other_bfd->my_archive->filename)) other_bfd->my_archive->filename) == 0)
{ continue;
/* Rename this implib to match the other */
char *n = (char *) xmalloc (strlen (other_bfd->my_archive->filename) + 1); /* Rename this implib to match the other. */
n = (char *) xmalloc (strlen (other_bfd->my_archive->filename) + 1);
strcpy (n, other_bfd->my_archive->filename); strcpy (n, other_bfd->my_archive->filename);
is->the_bfd->my_archive->filename = n; is->the_bfd->my_archive->filename = n;
} }
}
}
}
free (relocs); free (relocs);
/* Note - we do not free the symbols,
they are now cached in the BFD. */
} }
} }
} }