Revert last patch, and:
authorIan Lance Taylor <ian@airs.com>
Wed, 2 Apr 1997 22:47:29 +0000 (22:47 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 2 Apr 1997 22:47:29 +0000 (22:47 +0000)
* 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
bfd/elflink.h

index b79c57c..463810b 100644 (file)
@@ -6,8 +6,9 @@ Wed Apr  2 16:19:41 1997  Mike Meissner  <meissner@cygnus.com>
 
 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.
index 699b015..62d0c5a 100644 (file)
@@ -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))