From ee9f09cd2624af3cccfd08955c8aba7ede3b1c95 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 11 Oct 1995 04:50:20 +0000 Subject: [PATCH] * elflink.h (elf_link_add_object_symbols): Correct conditions under which type and size change warnings are issued. --- bfd/ChangeLog | 5 +++++ bfd/elflink.h | 25 ++++++++++++++++++------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 18f401a2870..5d3787ccfb0 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +Wed Oct 11 00:49:29 1995 Ian Lance Taylor + + * 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 * coffgen.c (coff_count_linenumbers): Don't count line numbers for diff --git a/bfd/elflink.h b/bfd/elflink.h index dc2da5ef3dc..86328d6b578 100644 --- a/bfd/elflink.h +++ b/bfd/elflink.h @@ -555,7 +555,7 @@ elf_link_add_object_symbols (abfd, info) const char *name; struct elf_link_hash_entry *h; boolean definition; - boolean wasweak; + boolean size_change_ok, type_change_ok; boolean new_weakdef; elf_swap_symbol_in (abfd, esym, &sym); @@ -642,7 +642,8 @@ elf_link_add_object_symbols (abfd, info) else definition = true; - wasweak = false; + size_change_ok = false; + type_change_ok = false; if (info->hash->creator->flavour == bfd_target_elf_flavour) { /* We need to look up the symbol now in order to get some of @@ -659,9 +660,17 @@ elf_link_add_object_symbols (abfd, info) || h->root.type == bfd_link_hash_warning) h = (struct elf_link_hash_entry *) h->root.u.i.link; - /* Remember whether this used to be a weak definition. */ - wasweak = (h->root.type == bfd_link_hash_defweak - || h->root.type == bfd_link_hash_undefweak); + /* It's OK to change the type if it used to be a weak + definition. */ + type_change_ok = (h->root.type == bfd_link_hash_defweak + || 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 definition, we need to see if it has already been defined @@ -678,6 +687,7 @@ elf_link_add_object_symbols (abfd, info) { sec = bfd_und_section_ptr; definition = false; + size_change_ok = true; } } @@ -702,6 +712,7 @@ elf_link_add_object_symbols (abfd, info) with the new definition. */ h->root.type = bfd_link_hash_undefined; 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 && (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) ("Warning: size of symbol `%s' changed from %lu to %lu in %s", 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 && h->type != ELF_ST_TYPE (sym.st_info) - && ! wasweak) + && ! type_change_ok) (*_bfd_error_handler) ("Warning: type of symbol `%s' changed from %d to %d in %s", name, h->type, ELF_ST_TYPE (sym.st_info), -- 2.30.2