PR 30569, delete _bfd_mips_elf_early_size_sections

PR30569 was triggered by a patch of mine 6540edd52c moving the call
to always_size_sections in bfd_elf_size_dynamic_sections earlier, made
to support the x86 DT_RELR implementation.  This broke mips16 code
handling stubs when --export-dynamic is passed to the linker, because
numerous symbols then became dynamic after always_size_sections.  The
mips backend fiddles with symbols in its always_size_sections.  Maciej
in 902e9fc76a had moved the call to always_size_sections to after
the export-dynamic code.  Prior to that, Nathan in 04c3a75556 moved
it before the exec stack code, back to the start of
bfd_elf_size_dynamic_sections which was where Ian put it originally
in ff12f30335.  So the call has moved around a little.  I'm leaving
it where it is, and instead calling mips_elf_check_symbols from
late_size_sections (the old size_dynamic_sections) which is now always
called.  In fact, the whole of _bfd_mips_elf_early_size_sections can
be merged into _bfd_mips_elf_late_size_sections.
This commit is contained in:
Alan Modra 2024-03-28 20:33:32 +10:30
parent af969b14ae
commit 3c6c32951e
5 changed files with 34 additions and 56 deletions

View File

@ -2537,7 +2537,6 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
#define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag
#define elf_backend_adjust_dynamic_symbol \
_bfd_mips_elf_adjust_dynamic_symbol
#define elf_backend_early_size_sections _bfd_mips_elf_early_size_sections
#define elf_backend_late_size_sections _bfd_mips_elf_late_size_sections
#define elf_backend_init_index_section _bfd_elf_init_1_index_section
#define elf_backend_relocate_section _bfd_mips_elf_relocate_section

View File

@ -4748,8 +4748,6 @@ const struct elf_size_info mips_elf64_size_info =
#define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag
#define elf_backend_adjust_dynamic_symbol \
_bfd_mips_elf_adjust_dynamic_symbol
#define elf_backend_early_size_sections \
_bfd_mips_elf_early_size_sections
#define elf_backend_late_size_sections \
_bfd_mips_elf_late_size_sections
#define elf_backend_init_index_section _bfd_elf_init_1_index_section

View File

@ -4138,7 +4138,6 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
#define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag
#define elf_backend_adjust_dynamic_symbol \
_bfd_mips_elf_adjust_dynamic_symbol
#define elf_backend_early_size_sections _bfd_mips_elf_early_size_sections
#define elf_backend_late_size_sections _bfd_mips_elf_late_size_sections
#define elf_backend_init_index_section _bfd_elf_init_1_index_section
#define elf_backend_relocate_section _bfd_mips_elf_relocate_section

View File

@ -9644,48 +9644,6 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
return _bfd_elf_adjust_dynamic_copy (info, h, s);
}
/* This function is called after all the input files have been read,
and the input sections have been assigned to output sections. We
check for any mips16 stub sections that we can discard. */
bool
_bfd_mips_elf_early_size_sections (bfd *output_bfd,
struct bfd_link_info *info)
{
asection *sect;
struct mips_elf_link_hash_table *htab;
struct mips_htab_traverse_info hti;
htab = mips_elf_hash_table (info);
BFD_ASSERT (htab != NULL);
/* The .reginfo section has a fixed size. */
sect = bfd_get_section_by_name (output_bfd, ".reginfo");
if (sect != NULL)
{
bfd_set_section_size (sect, sizeof (Elf32_External_RegInfo));
sect->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
}
/* The .MIPS.abiflags section has a fixed size. */
sect = bfd_get_section_by_name (output_bfd, ".MIPS.abiflags");
if (sect != NULL)
{
bfd_set_section_size (sect, sizeof (Elf_External_ABIFlags_v0));
sect->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
}
hti.info = info;
hti.output_bfd = output_bfd;
hti.error = false;
mips_elf_link_hash_traverse (mips_elf_hash_table (info),
mips_elf_check_symbols, &hti);
if (hti.error)
return false;
return true;
}
/* If the link uses a GOT, lay it out and work out its size. */
static bool
@ -9990,7 +9948,8 @@ mips_elf_set_plt_sym_value (struct mips_elf_link_hash_entry *h, void *data)
return true;
}
/* Set the sizes of the dynamic sections. */
/* Set the sizes of the dynamic sections, some mips non-dynamic sections,
and check for any mips16 stub sections that we can discard. */
bool
_bfd_mips_elf_late_size_sections (bfd *output_bfd,
@ -10000,14 +9959,39 @@ _bfd_mips_elf_late_size_sections (bfd *output_bfd,
asection *s, *sreldyn;
bool reltext;
struct mips_elf_link_hash_table *htab;
struct mips_htab_traverse_info hti;
htab = mips_elf_hash_table (info);
BFD_ASSERT (htab != NULL);
dynobj = elf_hash_table (info)->dynobj;
/* The .reginfo section has a fixed size. */
s = bfd_get_section_by_name (output_bfd, ".reginfo");
if (s != NULL)
{
bfd_set_section_size (s, sizeof (Elf32_External_RegInfo));
s->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
}
/* The .MIPS.abiflags section has a fixed size. */
s = bfd_get_section_by_name (output_bfd, ".MIPS.abiflags");
if (s != NULL)
{
bfd_set_section_size (s, sizeof (Elf_External_ABIFlags_v0));
s->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
}
hti.info = info;
hti.output_bfd = output_bfd;
hti.error = false;
mips_elf_link_hash_traverse (htab, mips_elf_check_symbols, &hti);
if (hti.error)
return false;
dynobj = htab->root.dynobj;
if (dynobj == NULL)
return true;
if (elf_hash_table (info)->dynamic_sections_created)
if (htab->root.dynamic_sections_created)
{
/* Set the contents of the .interp section to the interpreter. */
if (bfd_link_executable (info) && !info->nointerp)
@ -10147,7 +10131,7 @@ _bfd_mips_elf_late_size_sections (bfd *output_bfd,
}
}
else if (bfd_link_executable (info)
&& ! mips_elf_hash_table (info)->use_rld_obj_head
&& !htab->use_rld_obj_head
&& startswith (name, ".rld_map"))
{
/* We add a room for __rld_map. It will be filled in by the
@ -10156,7 +10140,7 @@ _bfd_mips_elf_late_size_sections (bfd *output_bfd,
}
else if (SGI_COMPAT (output_bfd)
&& startswith (name, ".compact_rel"))
s->size += mips_elf_hash_table (info)->compact_rel_size;
s->size += htab->compact_rel_size;
else if (s == htab->root.splt)
{
/* If the last PLT entry has a branch delay slot, allocate
@ -10196,7 +10180,7 @@ _bfd_mips_elf_late_size_sections (bfd *output_bfd,
}
}
if (elf_hash_table (info)->dynamic_sections_created)
if (htab->root.dynamic_sections_created)
{
/* Add some entries to the .dynamic section. We fill in the
values later, in _bfd_mips_elf_finish_dynamic_sections, but we
@ -14944,7 +14928,7 @@ _bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
input_section->flags &= ~SEC_HAS_CONTENTS;
}
/* Size has been set in _bfd_mips_elf_early_size_sections. */
/* Size has been set in _bfd_mips_elf_late_size_sections. */
BFD_ASSERT(o->size == sizeof (Elf_External_ABIFlags_v0));
/* Skip this section later on (I don't think this currently
@ -15003,7 +14987,7 @@ _bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
input_section->flags &= ~SEC_HAS_CONTENTS;
}
/* Size has been set in _bfd_mips_elf_early_size_sections. */
/* Size has been set in _bfd_mips_elf_late_size_sections. */
BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
/* Skip this section later on (I don't think this currently

View File

@ -67,8 +67,6 @@ extern bool _bfd_mips_elf_check_relocs
(bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
extern bool _bfd_mips_elf_adjust_dynamic_symbol
(struct bfd_link_info *, struct elf_link_hash_entry *);
extern bool _bfd_mips_elf_early_size_sections
(bfd *, struct bfd_link_info *);
extern bool _bfd_mips_elf_late_size_sections
(bfd *, struct bfd_link_info *);
extern int _bfd_mips_elf_relocate_section