diff options
author | Alan Modra <amodra@gmail.com> | 2022-01-12 12:37:27 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2022-01-12 12:55:17 +1030 |
commit | b02db37812bef6e12772bfbddd004e50534eaed1 (patch) | |
tree | 775ed5bbacbb532774161bd54e4e34b89f7c2f71 /bfd | |
parent | 295114a64ff50cc79e4510b8be935ebccda2900a (diff) | |
download | gdb-b02db37812bef6e12772bfbddd004e50534eaed1.zip gdb-b02db37812bef6e12772bfbddd004e50534eaed1.tar.gz gdb-b02db37812bef6e12772bfbddd004e50534eaed1.tar.bz2 |
Set SEC_ELF_REVERSE_COPY earlier
For the sake of DT_RELR.
bfd/
* elflink.c (elf_link_input_bfd): Don't set SEC_ELF_REVERSE_COPY
here. Move sanity checks to reverse copying code.
ld/
* ldlang.c (lang_add_section): Set SEC_ELF_REVERSE_COPY for
.ctors/.dtors in .init_array/.fini_array.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/elflink.c | 42 |
1 files changed, 16 insertions, 26 deletions
diff --git a/bfd/elflink.c b/bfd/elflink.c index 059461b..f5e3fd5 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -11247,31 +11247,6 @@ elf_link_input_bfd (struct elf_final_link_info *flinfo, bfd *input_bfd) && o->reloc_count > 0) return false; - /* We need to reverse-copy input .ctors/.dtors sections if - they are placed in .init_array/.finit_array for output. */ - if (o->size > address_size - && ((startswith (o->name, ".ctors") - && strcmp (o->output_section->name, - ".init_array") == 0) - || (startswith (o->name, ".dtors") - && strcmp (o->output_section->name, - ".fini_array") == 0)) - && (o->name[6] == 0 || o->name[6] == '.')) - { - if (o->size * bed->s->int_rels_per_ext_rel - != o->reloc_count * address_size) - { - _bfd_error_handler - /* xgettext:c-format */ - (_("error: %pB: size of section %pA is not " - "multiple of address size"), - input_bfd, o); - bfd_set_error (bfd_error_bad_value); - return false; - } - o->flags |= SEC_ELF_REVERSE_COPY; - } - action_discarded = -1; if (!elf_section_ignore_discarded_relocs (o)) action_discarded = (*bed->action_discarded) (o); @@ -11756,9 +11731,24 @@ elf_link_input_bfd (struct elf_final_link_info *flinfo, bfd *input_bfd) offset *= bfd_octets_per_byte (output_bfd, o); - if ((o->flags & SEC_ELF_REVERSE_COPY)) + if ((o->flags & SEC_ELF_REVERSE_COPY) + && o->size > address_size) { /* Reverse-copy input section to output. */ + + if (o->reloc_count != 0 + && (o->size * bed->s->int_rels_per_ext_rel + != o->reloc_count * address_size)) + { + _bfd_error_handler + /* xgettext:c-format */ + (_("error: %pB: size of section %pA is not " + "multiple of address size"), + input_bfd, o); + bfd_set_error (bfd_error_bad_value); + return false; + } + do { todo -= address_size; |