mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-28 18:10:46 +00:00
bfd/
* libbfd-in.h (_bfd_merge_section): New. (_bfd_write_merged_section): New. (_bfd_merged_section_offset): New. * libbfd.h: Rebuilt. * linker.c (_bfd_generic_link_output_symbols): Handle discard_sec_merge. * aoutx.h (aout_link_write_symbols): Likewise. * pdp11.c (aout_link_write_symbols): Likewise. * elflink.h (elf_link_add_object_symbols): Call _bfd_merge_section. (elf_bfd_final_link): Adjust global symbols pointing into SEC_MERGE sections. (elf_link_sec_merge_syms): New. (elf_link_input_bfd): Call _bfd_merged_section_offset and _bfd_write_merged_section. Handle discard_sec_merge. * elf-bfd.h (struct elf_link_hash_table): Add merge_info field. (struct bfd_elf_section_data): Likewise. * elf.c (_bfd_elf_make_section_from_shdr): Set SEC_MERGE and SEC_STRINGS section flags and entsize from their ELF counterparts. (_bfd_elf_link_hash_table_init): Initialize merge_info. (elf_fake_sections): Set SHF_MERGE, SHF_STRINGS and sh_entsize from their BFD counterparts. * merge.c: New file. * Makefile.am: Add strtab.lo. * Makefile.in: Rebuilt. include/ * bfdlink.h (bfd_link_discard): Add discard_sec_merge. gas/ * config/obj-elf.c (obj_elf_change_section): Add entsize argument, handle SHF_MERGE and SHF_STRINGS. (obj_elf_parse_section_letters): Set SHF_MERGE and SHF_STRINGS. (obj_elf_section): Allow additional argument specifying entity size. * write.c (adjust_reloc_syms): Keep relocations against local symbols in SEC_MERGE sections. ld/ * ldmain.c (main): Default to discard_sec_merge. * lexsup.c (OPTION_DISCARD_NONE): Define. (ld_options): Add --discard-none. (parse_args): Handle OPTION_DISCARD_NONE. * ldlang.c (wild_doit): SEC_MERGE should be set in the output section only if SEC_MERGE and SEC_STRINGS flags and entsize of all its input sections match.
This commit is contained in:
14
ld/ldlang.c
14
ld/ldlang.c
@@ -1176,8 +1176,22 @@ wild_doit (ptr, section, output, file)
|
||||
if (! first && (section->output_section->flags & SEC_READONLY) == 0)
|
||||
flags &= ~ SEC_READONLY;
|
||||
|
||||
/* Keep SEC_MERGE and SEC_STRINGS only if they are the same. */
|
||||
if (! first
|
||||
&& ((section->output_section->flags & (SEC_MERGE | SEC_STRINGS))
|
||||
!= (flags & (SEC_MERGE | SEC_STRINGS))
|
||||
|| ((flags & SEC_MERGE)
|
||||
&& section->output_section->entsize != section->entsize)))
|
||||
{
|
||||
section->output_section->flags &= ~ (SEC_MERGE | SEC_STRINGS);
|
||||
flags &= ~ (SEC_MERGE | SEC_STRINGS);
|
||||
}
|
||||
|
||||
section->output_section->flags |= flags;
|
||||
|
||||
if (flags & SEC_MERGE)
|
||||
section->output_section->entsize = section->entsize;
|
||||
|
||||
/* If SEC_READONLY is not set in the input section, then clear
|
||||
it from the output section. */
|
||||
if ((section->flags & SEC_READONLY) == 0)
|
||||
|
||||
Reference in New Issue
Block a user