Wed Apr 2 10:49:07 1997 Ian Lance Taylor <ian@cygnus.com>
- * elflink.h (elf_link_add_object_symbols): When there is a size
- change, use the larger size. From H.J. Lu <hjl@gnu.ai.mit.edu>.
+ * 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.
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;
{
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))