* libelf.h (ELF_LINK_HASH_DEFINED_WEAK): Define.
authorIan Lance Taylor <ian@airs.com>
Sun, 17 Jul 1994 02:15:24 +0000 (02:15 +0000)
committerIan Lance Taylor <ian@airs.com>
Sun, 17 Jul 1994 02:15:24 +0000 (02:15 +0000)
* elfcode.h (elf_link_add_object_symbols): If symbol is defined as
weak, set ELF_LINK_HASH_DEFINED_WEAK.
(elf_link_output_extsym): If symbol is defined as weak, mark it
STB_WEAK.

bfd/ChangeLog
bfd/elfcode.h
bfd/libelf.h

index 310c12d..002057d 100644 (file)
@@ -1,5 +1,11 @@
 Sat Jul 16 21:10:39 1994  Ian Lance Taylor  (ian@sanguine.cygnus.com)
 
+       * libelf.h (ELF_LINK_HASH_DEFINED_WEAK): Define.
+       * elfcode.h (elf_link_add_object_symbols): If symbol is defined as
+       weak, set ELF_LINK_HASH_DEFINED_WEAK.
+       (elf_link_output_extsym): If symbol is defined as weak, mark it
+       STB_WEAK.
+
        * libelf.h (struct bfd_elf_section_data): Add relocs field.
        (shdr_name): Remove; unused.
        * elfcode.h (elf_slurp_reloc_table): Rewrote to handle both REL
index 223b751..31452c8 100644 (file)
@@ -4286,7 +4286,19 @@ 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;
+             h->elf_link_hash_flags &=~ ELF_LINK_HASH_DEFINED_WEAK;
            }
+
+         /* If this is a weak definition which we are going to use,
+            and the symbol is currently undefined, record that the
+            definition is weak.  */
+         if (definition
+             && (flags & BSF_WEAK) != 0
+             && ! bfd_is_und_section (sec)
+             && (h->root.type == bfd_link_hash_new
+                 || h->root.type == bfd_link_hash_undefined
+                 || h->root.type == bfd_link_hash_weak))
+           h->elf_link_hash_flags |= ELF_LINK_HASH_DEFINED_WEAK;
        }
 
       if (! (_bfd_generic_link_add_one_symbol
@@ -5613,8 +5625,12 @@ elf_link_output_extsym (h, data)
 
   sym.st_value = 0;
   sym.st_size = h->size;
-  sym.st_info = ELF_ST_INFO (STB_GLOBAL, h->type);
   sym.st_other = 0;
+  if (h->root.type == bfd_link_hash_weak
+      || (h->elf_link_hash_flags & ELF_LINK_HASH_DEFINED_WEAK) != 0)
+    sym.st_info = ELF_ST_INFO (STB_WEAK, h->type);
+  else
+    sym.st_info = ELF_ST_INFO (STB_GLOBAL, h->type);
 
   switch (h->root.type)
     {
@@ -5631,7 +5647,6 @@ elf_link_output_extsym (h, data)
     case bfd_link_hash_weak:
       input_sec = bfd_und_section_ptr;
       sym.st_shndx = SHN_UNDEF;
-      sym.st_info = ELF_ST_INFO (STB_WEAK, h->type);
       break;
 
     case bfd_link_hash_defined:
index 84f79bb..cc6d8b8 100644 (file)
@@ -111,6 +111,8 @@ struct elf_link_hash_entry
 #define ELF_LINK_HASH_DEF_DYNAMIC_MULTIPLE 040
   /* Dynamic symbol has been adjustd.  */
 #define ELF_LINK_HASH_DYNAMIC_ADJUSTED 0100
+  /* Symbol is defined as weak.  */
+#define ELF_LINK_HASH_DEFINED_WEAK 0200
 };
 
 /* ELF linker hash table.  */