Line 602... |
Line 602... |
}
|
}
|
|
|
return bfd_link_hash_lookup (info->hash, string, create, copy, follow);
|
return bfd_link_hash_lookup (info->hash, string, create, copy, follow);
|
}
|
}
|
|
|
/* Traverse a generic link hash table. The only reason this is not a
|
/* Traverse a generic link hash table. Differs from bfd_hash_traverse
|
macro is to do better type checking. This code presumes that an
|
in the treatment of warning symbols. When warning symbols are
|
argument passed as a struct bfd_hash_entry * may be caught as a
|
created they replace the real symbol, so you don't get to see the
|
struct bfd_link_hash_entry * with no explicit cast required on the
|
real symbol in a bfd_hash_travere. This traversal calls func with
|
call. */
|
the real symbol. */
|
|
|
void
|
void
|
bfd_link_hash_traverse
|
bfd_link_hash_traverse
|
(struct bfd_link_hash_table *table,
|
(struct bfd_link_hash_table *htab,
|
bfd_boolean (*func) (struct bfd_link_hash_entry *, void *),
|
bfd_boolean (*func) (struct bfd_link_hash_entry *, void *),
|
void *info)
|
void *info)
|
{
|
{
|
bfd_hash_traverse (&table->table,
|
unsigned int i;
|
(bfd_boolean (*) (struct bfd_hash_entry *, void *)) func,
|
|
info);
|
htab->table.frozen = 1;
|
|
for (i = 0; i < htab->table.size; i++)
|
|
{
|
|
struct bfd_link_hash_entry *p;
|
|
|
|
p = (struct bfd_link_hash_entry *) htab->table.table[i];
|
|
for (; p != NULL; p = (struct bfd_link_hash_entry *) p->root.next)
|
|
if (!(*func) (p->type == bfd_link_hash_warning ? p->u.i.link : p, info))
|
|
goto out;
|
|
}
|
|
out:
|
|
htab->table.frozen = 0;
|
}
|
}
|
|
|
/* Add a symbol to the linker hash table undefs list. */
|
/* Add a symbol to the linker hash table undefs list. */
|
|
|
void
|
void
|
Line 1564... |
Line 1575... |
{
|
{
|
enum link_row row;
|
enum link_row row;
|
struct bfd_link_hash_entry *h;
|
struct bfd_link_hash_entry *h;
|
bfd_boolean cycle;
|
bfd_boolean cycle;
|
|
|
|
BFD_ASSERT (section != NULL);
|
|
|
if (bfd_is_ind_section (section)
|
if (bfd_is_ind_section (section)
|
|| (flags & BSF_INDIRECT) != 0)
|
|| (flags & BSF_INDIRECT) != 0)
|
row = INDR_ROW;
|
row = INDR_ROW;
|
else if ((flags & BSF_WARNING) != 0)
|
else if ((flags & BSF_WARNING) != 0)
|
row = WARN_ROW;
|
row = WARN_ROW;
|
Line 2438... |
Line 2451... |
{
|
{
|
struct generic_write_global_symbol_info *wginfo =
|
struct generic_write_global_symbol_info *wginfo =
|
(struct generic_write_global_symbol_info *) data;
|
(struct generic_write_global_symbol_info *) data;
|
asymbol *sym;
|
asymbol *sym;
|
|
|
if (h->root.type == bfd_link_hash_warning)
|
|
h = (struct generic_link_hash_entry *) h->root.u.i.link;
|
|
|
|
if (h->written)
|
if (h->written)
|
return TRUE;
|
return TRUE;
|
|
|
h->written = TRUE;
|
h->written = TRUE;
|
|
|
Line 3091... |
Line 3101... |
static bfd_boolean
|
static bfd_boolean
|
fix_syms (struct bfd_link_hash_entry *h, void *data)
|
fix_syms (struct bfd_link_hash_entry *h, void *data)
|
{
|
{
|
bfd *obfd = (bfd *) data;
|
bfd *obfd = (bfd *) data;
|
|
|
if (h->type == bfd_link_hash_warning)
|
|
h = h->u.i.link;
|
|
|
|
if (h->type == bfd_link_hash_defined
|
if (h->type == bfd_link_hash_defined
|
|| h->type == bfd_link_hash_defweak)
|
|| h->type == bfd_link_hash_defweak)
|
{
|
{
|
asection *s = h->u.def.section;
|
asection *s = h->u.def.section;
|
if (s != NULL
|
if (s != NULL
|