diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2022-01-06 08:45:16 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2022-01-12 05:15:18 -0800 |
commit | e2cbf4df83fe57892a6aaedf737b84baa6321fa7 (patch) | |
tree | 900d45cb8e5c64d097999b4532be7d38753c645e /bfd | |
parent | fc07cf22c679002bb57e9259eca5dfd6891eb962 (diff) | |
download | gdb-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.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/elf-bfd.h | 2 | ||||
-rw-r--r-- | bfd/elf.c | 9 | ||||
-rw-r--r-- | bfd/elflink.c | 3 |
3 files changed, 9 insertions, 5 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); @@ -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; |