summaryrefslogtreecommitdiff
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2013-11-04 09:35:07 -0800
committerH.J. Lu <hjl.tools@gmail.com>2015-09-17 05:24:15 -0700
commitef1ce0a3648bd8d6b086bf3e05143a187d5b807f (patch)
tree9a44a8cef2bb3d6ad93906129ff6636ed624833b /bfd/elf.c
parentd78908cff50f281dab6390646fb1b7c58236d83e (diff)
downloadbinutils-gdb-users/hjl/secondary.tar.gz
Add STB_SECONDARY supportusers/hjl/secondary
STB_SECONDARY is similar to STB_WEAK. But a STB_SECONDARY definition can be overridden by STB_GLOBAL or STB_WEAK definition at link-time as well as run-time. Linker also search archive library and extract archive members to resolve defined and undefined STB_SECONDARY symbol. bfd/ * archive.c (_bfd_compute_and_write_armap): Treat BSF_SECONDARY symbol as global. * elf32-mips.c (mips_elf_sym_is_global): Likewise. * elfn32-mips.c (mips_elf_sym_is_global): Likewise. * elf.c (sym_is_global): Likewise. (swap_out_syms): Output undefined secondary symbols as weak. Output defined secondary symbols. * elf64-ia64-vms.c (elf64_vms_link_add_object_symbols): Handle secondary symbols. * elfcode.h (elf_slurp_symbol_table): Likewise. * elflink.c (_bfd_elf_merge_symbol): Add a boolean argument to indicate if the old definition is secondary. Set OLDSECONADRY if it isn't TRUE. Treat old secondary symbol as weak. Allow overriding secondary symbols. (_bfd_elf_add_default_symbol): Add a boolean argument to if the old definition is secondary. Handle the unversioned STB_SECONDARY symbol with the versioned definition. * elflink.c (is_global_data_symbol_definition): Renamed to ... (is_global_symbol_definition): This. Add an argument to ignore secondary symbols. If secondary symbols are ignored, count function and common symbols as global definition. (elf_link_is_defined_archive_symbol): Add an argument to ignore secondary symbols. Updated. (elf_link_add_object_symbols): Treat secondary symbols as weak symbols. Allow overriding secondary symbols. Pass oldsecondary to _bfd_elf_merge_symbol and _bfd_elf_add_default_symbol. (elf_link_add_archive_symbols): Keep searching if a definition is secondary. Ignore another secondary definition. Updated. (elf_link_output_extsym): Generate STB_SECONDARY symbols if needed. * linker.c (_bfd_generic_link_add_one_symbol): Treat secondary symbol as weak symbol. Mark secondary symbol. * syms.c (BSF_SECONDARY): New. (bfd_print_symbol_vandf): Handle SECONDARY symbol. (bfd_decode_symclass): Likewise. * bfd-in2.h: Regenerated. binutils/ * nm.c (filter_symbols): Treat BSF_SECONDARY symbol as global. * readelf.c (get_symbol_binding): Handle STB_SECONDARY. gas/ * symbols.c (S_IS_SECONDARY): New. (S_SET_SECONDARY): Likewise. (S_FORCE_RELOC): Handle BSF_SECONDARY like BSF_WEAK. (S_SET_EXTERNAL): Likewise. (S_CLEAR_EXTERNAL): Likewise. (S_CLEAR_WEAKREFD): Likewise. (S_SET_WEAK): Also clear BSF_SECONDARY. * symbols.h (S_IS_SECONDARY): New. (S_SET_SECONDARY): Likewise. * config/obj-elf.c (obj_elf_secondary): New. (elf_pseudo_table): Add "secondary". (obj_elf_weak): Don't set symbol weak on secondary symbol. (elf_frob_symbol): Check secondary symbol. Handle secondary symbol for .symver. Also remove the unused secondary symbol. (elf_frob_file_before_adjust): Treat secondary symbols as weak. * doc/as.texinfo: Document .secondary directive. gas/testsuite/ * gas/elf/common3.d: New file. * gas/elf/common3.l: Likewise. * gas/elf/common3.s: Likewise. * gas/elf/common4.d: Likewise. * gas/elf/common4.l: Likewise. * gas/elf/common4.s: Likewise. * gas/elf/secondary1.e: Likewise. * gas/elf/secondary1.s: Likewise. * gas/elf/secondary2.e: Likewise. * gas/elf/secondary2.s: Likewise. * gas/elf/elf.exp: Run common3, common4, secondary1 and secondary2. * gas/elf/type.s: Add .secondary tests. * gas/elf/type.e: Updated. include/ * bfdlink.h (bfd_link_hash_entry): Add secondary. (bfd_link_info): Add emit_secondary. include/elf/ * common.h (STB_SECONDARY): New. ld/ * ld.texinfo: Document "-z nosecondary". * ldmain.c (main): Initialize link_info.emit_secondary to TRUE. * lexsup.c (elf_shlib_list_options): Add "-z nosecondary". * emultempl/elf32.em (gld${EMULATION_NAME}_handle_option): Set to link_info.emit_secondary to FALSE for "-z nosecondary". (gld${EMULATION_NAME}_list_options): Replace "-z secondary" with "-z nosecondary". ld/testsuite/ * ld-elf/library1.c: New file. * ld-elf/library1.out: Likewise. * ld-elf/library2.c: Likewise. * ld-elf/library2.out: Likewise. * ld-elf/library3.out: Likewise. * ld-elf/library4.out: Likewise. * ld-elf/library5a.c: Likewise. * ld-elf/library5b.c: Likewise. * ld-elf/library6a.c: Likewise. * ld-elf/library6b.c: Likewise. * ld-elf/library6c.c: Likewise. * ld-elf/library7a.c: Likewise. * ld-elf/library7b.c: Likewise. * ld-elf/library7c.c: Likewise. * ld-elf/library8.map: Likewise. * ld-elf/library8a.c: Likewise. * ld-elf/library8a.rd: Likewise. * ld-elf/library8b.c: Likewise. * ld-elf/library8b.rd: Likewise. * ld-elf/library8c.c: Likewise. * ld-elf/library8c.rd: Likewise. * ld-elf/secondary-foo.c: Likewise. * ld-elf/secondary-main.c: Likewise. * ld-elf/secondary.c: Likewise. * ld-elf/secondary.exp: Likewise. * ld-elf/secondary.rd: Likewise. * ld-elf/secondary1.out: Likewise. * ld-elf/secondary1.rd: Likewise. * ld-elf/secondary2.rd: Likewise. * ld-elf/secondary3.rd: Likewise. * ld-elf/secondary3a.s: Likewise. * ld-elf/secondary3b.s: Likewise. * ld-elf/secondary4.rd: Likewise. * ld-elf/secondary4.s: Likewise. * ld-elf/secondary5.c: Likewise. * ld-elf/secondary5.out: Likewise. * ld-elf/secondary6.c: Likewise. * ld-elf/secondary6.out: Likewise. * ld-elf/secondary7.c: Likewise. * ld-elf/secondary7.out: Likewise. * ld-elf/secondary8a.c: Likewise. * ld-elf/secondary8a.map: Likewise. * ld-elf/secondary8a.rd: Likewise. * ld-elf/secondary8b.c: Likewise. * ld-elf/secondary8b.rd: Likewise.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r--bfd/elf.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index 35c0f6cdf43..29cfec333e3 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -3625,7 +3625,10 @@ sym_is_global (bfd *abfd, asymbol *sym)
if (bed->elf_backend_sym_is_global)
return (*bed->elf_backend_sym_is_global) (abfd, sym);
- return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
+ return ((sym->flags & (BSF_GLOBAL
+ | BSF_WEAK
+ | BSF_SECONDARY
+ | BSF_GNU_UNIQUE)) != 0
|| bfd_is_und_section (bfd_get_section (sym))
|| bfd_is_com_section (bfd_get_section (sym)));
}
@@ -7408,8 +7411,9 @@ Unable to find equivalent output section for symbol '%s' from section '%s'"),
#endif
sym.st_info = ELF_ST_INFO (STB_GLOBAL, type);
}
+ /* Output undefined secondary symbols as weak. */
else if (bfd_is_und_section (syms[idx]->section))
- sym.st_info = ELF_ST_INFO (((flags & BSF_WEAK)
+ sym.st_info = ELF_ST_INFO (((flags & (BSF_WEAK | BSF_SECONDARY))
? STB_WEAK
: STB_GLOBAL),
type);
@@ -7423,6 +7427,8 @@ Unable to find equivalent output section for symbol '%s' from section '%s'"),
bind = STB_LOCAL;
else if (flags & BSF_GNU_UNIQUE)
bind = STB_GNU_UNIQUE;
+ else if (flags & BSF_SECONDARY)
+ bind = STB_SECONDARY;
else if (flags & BSF_WEAK)
bind = STB_WEAK;
else if (flags & BSF_GLOBAL)