mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-30 00:52:16 +08:00
Add tests of return values from bfd function calls
This commit is contained in:
@ -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'
|
||||||
|
@ -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);
|
||||||
|
if (nrelocs < 0)
|
||||||
|
{
|
||||||
|
free (relocs);
|
||||||
|
einfo ("%X%P: unable to process relocs: %E");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < nrelocs; i++)
|
for (i = 0; i < nrelocs; i++)
|
||||||
{
|
{
|
||||||
struct symbol_cache_entry *s;
|
struct symbol_cache_entry *s;
|
||||||
s = (relocs[i]->sym_ptr_ptr)[0];
|
|
||||||
if (!s->flags & BSF_LOCAL)
|
|
||||||
{
|
|
||||||
/* thunk section with reloc to another bfd... */
|
|
||||||
struct bfd_link_hash_entry * blhe;
|
struct bfd_link_hash_entry * blhe;
|
||||||
|
bfd *other_bfd;
|
||||||
|
char *n;
|
||||||
|
|
||||||
|
s = (relocs[i]->sym_ptr_ptr)[0];
|
||||||
|
|
||||||
|
if (s->flags & BSF_LOCAL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* 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. */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user