diff mbox series

[04/10] elf: Pass need_layout to _bfd_elf_map_sections_to_segments

Message ID 20220107190631.309790-5-hjl.tools@gmail.com
State New
Headers show
Series ld: Implement DT_RELR for x86 | expand

Commit Message

H.J. Lu Jan. 7, 2022, 7:06 p.m. UTC
On some targets, the DT_RELR section size can be computed only after all
symbols addresses can be determined.  Update ldelf_map_segments to pass
need_layout to _bfd_elf_map_sections_to_segments which will size DT_RELR
section and set need_layout to true if the DT_RELR section size is changed.

bfd/

	* elf-bfd.h (_bfd_elf_map_sections_to_segments): Add a bool
	pointer argument.
	* elf.c (_bfd_elf_map_sections_to_segments): Add a bool pointer
	argument to indicate if section layout needs update.
	(assign_file_positions_for_load_sections): Pass NULL to
	_bfd_elf_map_sections_to_segments.
	* elflink.c (_bfd_elf_strip_zero_sized_dynamic_sections): Pass
	NULL to _bfd_elf_map_sections_to_segments.

ld/

	* ldelfgen.c (ldelf_map_segments): Pass &need_layout to
	_bfd_elf_map_sections_to_segments.
---
 bfd/elf-bfd.h | 2 +-
 bfd/elf.c     | 9 ++++++---
 bfd/elflink.c | 3 ++-
 ld/ldelfgen.c | 3 ++-
 4 files changed, 11 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 2441b3c0cd7..c4d2ef00d6b 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2718,7 +2718,7 @@  extern struct elf_segment_map * _bfd_elf_make_dynamic_segment
   (bfd *, asection *);
 
 extern bool _bfd_elf_map_sections_to_segments
-  (bfd *, struct bfd_link_info *);
+  (bfd *, struct bfd_link_info *, bool *);
 
 extern bool _bfd_elf_is_function_type (unsigned int);
 
diff --git a/bfd/elf.c b/bfd/elf.c
index ef0d18105ba..8b866b63e18 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4609,10 +4609,13 @@  elf_modify_segment_map (bfd *abfd,
 #define IS_TBSS(s) \
   ((s->flags & (SEC_THREAD_LOCAL | SEC_LOAD)) == SEC_THREAD_LOCAL)
 
-/* Set up a mapping from BFD sections to program segments.  */
+/* Set up a mapping from BFD sections to program segments.  Update
+   NEED_LAYOUT if the section layout is changed.  */
 
 bool
-_bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
+_bfd_elf_map_sections_to_segments (bfd *abfd,
+				   struct bfd_link_info *info,
+				   bool *need_layout ATTRIBUTE_UNUSED)
 {
   unsigned int count;
   struct elf_segment_map *m;
@@ -5416,7 +5419,7 @@  assign_file_positions_for_load_sections (bfd *abfd,
   unsigned int opb = bfd_octets_per_byte (abfd, NULL);
 
   if (link_info == NULL
-      && !_bfd_elf_map_sections_to_segments (abfd, link_info))
+      && !_bfd_elf_map_sections_to_segments (abfd, link_info, NULL))
     return false;
 
   alloc = 0;
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 29ef9ddf8b9..bea413ec24e 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -3676,7 +3676,8 @@  _bfd_elf_strip_zero_sized_dynamic_sections (struct bfd_link_info *info)
     {
       /* Regenerate program headers.  */
       elf_seg_map (info->output_bfd) = NULL;
-      return _bfd_elf_map_sections_to_segments (info->output_bfd, info);
+      return _bfd_elf_map_sections_to_segments (info->output_bfd, info,
+						NULL);
     }
 
   return true;
diff --git a/ld/ldelfgen.c b/ld/ldelfgen.c
index 5c033bbfbe0..58b37c65bc9 100644
--- a/ld/ldelfgen.c
+++ b/ld/ldelfgen.c
@@ -304,7 +304,8 @@  ldelf_map_segments (bool need_layout)
 	  if (lang_phdr_list == NULL)
 	    elf_seg_map (link_info.output_bfd) = NULL;
 	  if (!_bfd_elf_map_sections_to_segments (link_info.output_bfd,
-						  &link_info))
+						  &link_info,
+						  &need_layout))
 	    einfo (_("%F%P: map sections to segments failed: %E\n"));
 
 	  if (phdr_size != elf_program_header_size (link_info.output_bfd))