From ba254dc504f848de3eef9af6162344675f5cd09f Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 2 Apr 1997 22:47:29 +0000 Subject: [PATCH] Revert last patch, and: * elflink.h (elf_link_add_object_symbols): Let a common symbol override an uninitialized symbol from a shared library with a smaller size. --- bfd/ChangeLog | 5 +++-- bfd/elflink.h | 26 ++++++++++++++------------ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b79c57ca6fe..463810b6530 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -6,8 +6,9 @@ Wed Apr 2 16:19:41 1997 Mike Meissner Wed Apr 2 10:49:07 1997 Ian Lance Taylor - * elflink.h (elf_link_add_object_symbols): When there is a size - change, use the larger size. From H.J. Lu . + * elflink.h (elf_link_add_object_symbols): Let a common symbol + override an uninitialized symbol from a shared library with a + smaller size. * elf-m10200.c: Rename from elf32-mn10200.c. * elf-m10300.c: Rename from elf32-mn10300.c. diff --git a/bfd/elflink.h b/bfd/elflink.h index 699b015e742..62d0c5a730b 100644 --- a/bfd/elflink.h +++ b/bfd/elflink.h @@ -887,14 +887,20 @@ elf_link_add_object_symbols (abfd, info) library is a function, since common symbols always represent variables; this can cause confusion in principle, but any such confusion would seem to indicate - an erroneous program or shared library. */ + an erroneous program or shared library. We also treat a + common symbol as a definition if the symbol in the shared + library is in an uninitialized section, and it has a + smaller size. */ if (dynamic && definition) { if (h->root.type == bfd_link_hash_defined || h->root.type == bfd_link_hash_defweak || (h->root.type == bfd_link_hash_common - && (bind == STB_WEAK - || ELF_ST_TYPE (sym.st_info) == STT_FUNC))) + && ((bind == STB_WEAK + || ELF_ST_TYPE (sym.st_info) == STT_FUNC) + || ((sec->flags & SEC_ALLOC) != 0 + && (sec->flags & SEC_LOAD) == 0 + && sym.st_size < h->size)))) { override = true; sec = bfd_und_section_ptr; @@ -998,15 +1004,11 @@ elf_link_add_object_symbols (abfd, info) { if (h->size != 0 && h->size != sym.st_size && ! size_change_ok) (*_bfd_error_handler) - ("Warning: size of symbol `%s' was %lu, but in %s is %lu; using %lu", - name, (unsigned long) h->size, - bfd_get_filename (abfd), (unsigned long) sym.st_size, - (h->size < sym.st_size - ? (unsigned long) sym.st_size - : (unsigned long) h->size)); - - if (h->size < sym.st_size) - h->size = sym.st_size; + ("Warning: size of symbol `%s' changed from %lu to %lu in %s", + name, (unsigned long) h->size, (unsigned long) sym.st_size, + bfd_get_filename (abfd)); + + h->size = sym.st_size; } if (ELF_ST_TYPE (sym.st_info) != STT_NOTYPE && (definition || h->type == STT_NOTYPE)) -- 2.30.2