diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2013-11-04 09:35:07 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-09-17 05:24:15 -0700 |
commit | ef1ce0a3648bd8d6b086bf3e05143a187d5b807f (patch) | |
tree | 9a44a8cef2bb3d6ad93906129ff6636ed624833b /bfd/elf.c | |
parent | d78908cff50f281dab6390646fb1b7c58236d83e (diff) | |
download | binutils-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.c | 10 |
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) |