diff options
author | Alan Modra <amodra@gmail.com> | 2023-03-18 15:28:19 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2023-03-19 22:19:19 +1030 |
commit | 5f51eb9397768a6d93e523e05f5b7e8f78465c71 (patch) | |
tree | f46bb3a4d29c2ee44400c42ef27db94bef2aee5f /bfd | |
parent | 75831f18a0326573a2116e1f57fa5c8e09bd7738 (diff) | |
download | gdb-5f51eb9397768a6d93e523e05f5b7e8f78465c71.zip gdb-5f51eb9397768a6d93e523e05f5b7e8f78465c71.tar.gz gdb-5f51eb9397768a6d93e523e05f5b7e8f78465c71.tar.bz2 |
rewrite_elf_program_header and want_p_paddr_set_to_zero
Layout in rewrite_elf_program_header is really done by lma, even if
program headers are going to have their p_paddr forced to zero. Thus
when not matching against an existing segment, don't try to use a
"vma" from elf_segment_map.
* elf.c (is_contained_by): Replace "bed" param with "use_vaddr".
(IS_SECTION_IN_INPUT_SEGMENT): Adjust is_contained_by call.
(rewrite_elf_program_header): Always match against lma in
calls to is_contained_by using new maps.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/elf.c | 15 |
1 files changed, 8 insertions, 7 deletions
@@ -6893,14 +6893,14 @@ section_size (asection *section, Elf_Internal_Phdr *segment) /* Returns TRUE if the given section is contained within the given segment. LMA addresses are compared against PADDR when - bed->want_p_paddr_set_to_zero is false, VMA against VADDR when true. */ + USE_VADDR is false, VMA against VADDR when true. */ static bool is_contained_by (asection *section, Elf_Internal_Phdr *segment, bfd_vma paddr, bfd_vma vaddr, unsigned int opb, - const struct elf_backend_data *bed) + bool use_vaddr) { - bfd_vma seg_addr = !bed->want_p_paddr_set_to_zero ? paddr : vaddr; - bfd_vma addr = !bed->want_p_paddr_set_to_zero ? section->lma : section->vma; + bfd_vma seg_addr = !use_vaddr ? paddr : vaddr; + bfd_vma addr = !use_vaddr ? section->lma : section->vma; bfd_vma octet; if (_bfd_mul_overflow (addr, opb, &octet)) return false; @@ -6982,7 +6982,8 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd, bfd_vma maxpagesize) (with the possible exception of .dynamic). */ #define IS_SECTION_IN_INPUT_SEGMENT(section, segment, bed, opb) \ (((is_contained_by (section, segment, segment->p_paddr, \ - segment->p_vaddr, opb, bed) \ + segment->p_vaddr, opb, \ + bed->want_p_paddr_set_to_zero) \ && (section->flags & SEC_ALLOC) != 0) \ || is_note (section, segment)) \ && segment->p_type != PT_GNU_STACK \ @@ -7309,7 +7310,7 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd, bfd_vma maxpagesize) /* Match up the physical address of the segment with the LMA address of the output section. */ if (is_contained_by (output_section, segment, map->p_paddr, - map->p_paddr + map->p_vaddr_offset, opb, bed) + 0, opb, false) || is_note (section, segment)) { if (matching_lma == NULL @@ -7427,7 +7428,7 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd, bfd_vma maxpagesize) BFD_ASSERT (output_section != NULL); if (is_contained_by (output_section, segment, map->p_paddr, - map->p_paddr + map->p_vaddr_offset, opb, bed) + 0, opb, false) || is_note (section, segment)) { if (map->count == 0) |