* elflink.h (elf_link_add_object_symbols): Correct conditions

under which type and size change warnings are issued.
This commit is contained in:
Ian Lance Taylor 1995-10-11 04:50:20 +00:00
parent 78b31b6bb8
commit ee9f09cd26
2 changed files with 23 additions and 7 deletions

View file

@ -1,3 +1,8 @@
Wed Oct 11 00:49:29 1995 Ian Lance Taylor <ian@cygnus.com>
* elflink.h (elf_link_add_object_symbols): Correct conditions
under which type and size change warnings are issued.
Tue Oct 10 18:32:46 1995 Ian Lance Taylor <ian@cygnus.com> Tue Oct 10 18:32:46 1995 Ian Lance Taylor <ian@cygnus.com>
* coffgen.c (coff_count_linenumbers): Don't count line numbers for * coffgen.c (coff_count_linenumbers): Don't count line numbers for

View file

@ -555,7 +555,7 @@ elf_link_add_object_symbols (abfd, info)
const char *name; const char *name;
struct elf_link_hash_entry *h; struct elf_link_hash_entry *h;
boolean definition; boolean definition;
boolean wasweak; boolean size_change_ok, type_change_ok;
boolean new_weakdef; boolean new_weakdef;
elf_swap_symbol_in (abfd, esym, &sym); elf_swap_symbol_in (abfd, esym, &sym);
@ -642,7 +642,8 @@ elf_link_add_object_symbols (abfd, info)
else else
definition = true; definition = true;
wasweak = false; size_change_ok = false;
type_change_ok = false;
if (info->hash->creator->flavour == bfd_target_elf_flavour) if (info->hash->creator->flavour == bfd_target_elf_flavour)
{ {
/* We need to look up the symbol now in order to get some of /* We need to look up the symbol now in order to get some of
@ -659,10 +660,18 @@ elf_link_add_object_symbols (abfd, info)
|| h->root.type == bfd_link_hash_warning) || h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link; h = (struct elf_link_hash_entry *) h->root.u.i.link;
/* Remember whether this used to be a weak definition. */ /* It's OK to change the type if it used to be a weak
wasweak = (h->root.type == bfd_link_hash_defweak definition. */
type_change_ok = (h->root.type == bfd_link_hash_defweak
|| h->root.type == bfd_link_hash_undefweak); || h->root.type == bfd_link_hash_undefweak);
/* It's OK to change the size if it used to be a weak
definition, or if it used to be undefined, or if we will
be overriding an old definition.
*/
size_change_ok = (type_change_ok
|| h->root.type == bfd_link_hash_undefined);
/* If we are looking at a dynamic object, and this is a /* If we are looking at a dynamic object, and this is a
definition, we need to see if it has already been defined definition, we need to see if it has already been defined
by some other object. If it has, we want to use the by some other object. If it has, we want to use the
@ -678,6 +687,7 @@ elf_link_add_object_symbols (abfd, info)
{ {
sec = bfd_und_section_ptr; sec = bfd_und_section_ptr;
definition = false; definition = false;
size_change_ok = true;
} }
} }
@ -702,6 +712,7 @@ elf_link_add_object_symbols (abfd, info)
with the new definition. */ with the new definition. */
h->root.type = bfd_link_hash_undefined; h->root.type = bfd_link_hash_undefined;
h->root.u.undef.abfd = h->root.u.def.section->owner; h->root.u.undef.abfd = h->root.u.def.section->owner;
size_change_ok = true;
} }
} }
@ -756,7 +767,7 @@ elf_link_add_object_symbols (abfd, info)
if (sym.st_size != 0 if (sym.st_size != 0
&& (definition || h->size == 0)) && (definition || h->size == 0))
{ {
if (h->size != 0 && h->size != sym.st_size && ! wasweak) if (h->size != 0 && h->size != sym.st_size && ! size_change_ok)
(*_bfd_error_handler) (*_bfd_error_handler)
("Warning: size of symbol `%s' changed from %lu to %lu in %s", ("Warning: size of symbol `%s' changed from %lu to %lu in %s",
name, (unsigned long) h->size, (unsigned long) sym.st_size, name, (unsigned long) h->size, (unsigned long) sym.st_size,
@ -769,7 +780,7 @@ elf_link_add_object_symbols (abfd, info)
{ {
if (h->type != STT_NOTYPE if (h->type != STT_NOTYPE
&& h->type != ELF_ST_TYPE (sym.st_info) && h->type != ELF_ST_TYPE (sym.st_info)
&& ! wasweak) && ! type_change_ok)
(*_bfd_error_handler) (*_bfd_error_handler)
("Warning: type of symbol `%s' changed from %d to %d in %s", ("Warning: type of symbol `%s' changed from %d to %d in %s",
name, h->type, ELF_ST_TYPE (sym.st_info), name, h->type, ELF_ST_TYPE (sym.st_info),