aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2022-01-06 08:45:16 -0800
committerH.J. Lu <hjl.tools@gmail.com>2022-01-12 05:15:18 -0800
commite2cbf4df83fe57892a6aaedf737b84baa6321fa7 (patch)
tree900d45cb8e5c64d097999b4532be7d38753c645e
parentfc07cf22c679002bb57e9259eca5dfd6891eb962 (diff)
downloadgdb-e2cbf4df83fe57892a6aaedf737b84baa6321fa7.zip
gdb-e2cbf4df83fe57892a6aaedf737b84baa6321fa7.tar.gz
gdb-e2cbf4df83fe57892a6aaedf737b84baa6321fa7.tar.bz2
elf: Pass need_layout to _bfd_elf_map_sections_to_segments
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.
-rw-r--r--bfd/elf-bfd.h2
-rw-r--r--bfd/elf.c9
-rw-r--r--bfd/elflink.c3
-rw-r--r--ld/ldelfgen.c3
4 files changed, 11 insertions, 6 deletions
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 81f8fd4..0d9c764 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2716,7 +2716,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 ef0d181..8b866b6 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 f5e3fd5..46bff27 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 5c033bb..58b37c6 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))