elf: Add size_relative_relocs and finish_relative_relocs

On some targets, the DT_RELR section size can be computed only after all
symbols addresses can be determined.  Set the preliminary DT_RELR section
size before mapping sections to segments and set the final DT_RELR section
size after regular symbol processing is done.

	* elf-bfd.h (elf_backend_data): Add size_relative_relocs and
	finish_relative_relocs.
	* elf.c (_bfd_elf_map_sections_to_segments): Call
	size_relative_relocs if DT_RELR is enabled.
	* elflink.c (bfd_elf_final_link): Call finish_relative_relocs
	after regular symbol processing is finished if DT_RELR is enabled.
	* elfxx-target.h (elf_backend_size_relative_relocs): New.
	(elf_backend_finish_relative_relocs): Likewise.
	(elfNN_bed): Add elf_backend_size_relative_relocs and
	elf_backend_finish_relative_relocs.
This commit is contained in:
H.J. Lu
2022-01-06 09:24:41 -08:00
parent 6a91be8666
commit 23cc1de50b
4 changed files with 38 additions and 2 deletions

View File

@ -4615,7 +4615,7 @@ elf_modify_segment_map (bfd *abfd,
bool
_bfd_elf_map_sections_to_segments (bfd *abfd,
struct bfd_link_info *info,
bool *need_layout ATTRIBUTE_UNUSED)
bool *need_layout)
{
unsigned int count;
struct elf_segment_map *m;
@ -4626,7 +4626,17 @@ _bfd_elf_map_sections_to_segments (bfd *abfd,
no_user_phdrs = elf_seg_map (abfd) == NULL;
if (info != NULL)
info->user_phdrs = !no_user_phdrs;
{
info->user_phdrs = !no_user_phdrs;
/* Size the relative relocations if DT_RELR is enabled. */
if (info->enable_dt_relr
&& need_layout != NULL
&& bed->size_relative_relocs
&& !bed->size_relative_relocs (info, need_layout))
info->callbacks->einfo
(_("%F%P: failed to size relative relocations\n"));
}
if (no_user_phdrs && bfd_count_sections (abfd) != 0)
{