From bf73e4f3fe7e4a4da67fae7444084343209ee6e6 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sun, 17 Jul 1994 02:15:24 +0000 Subject: [PATCH] * 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. --- bfd/ChangeLog | 6 ++++++ bfd/elfcode.h | 19 +++++++++++++++++-- bfd/libelf.h | 2 ++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 310c12d2bd..002057d6e7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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 diff --git a/bfd/elfcode.h b/bfd/elfcode.h index 223b75185c..31452c8760 100644 --- a/bfd/elfcode.h +++ b/bfd/elfcode.h @@ -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: diff --git a/bfd/libelf.h b/bfd/libelf.h index 84f79bb238..cc6d8b81d3 100644 --- a/bfd/libelf.h +++ b/bfd/libelf.h @@ -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. */