summaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2023-03-18 15:28:19 +1030
committerAlan Modra <amodra@gmail.com>2023-03-19 22:19:19 +1030
commit5f51eb9397768a6d93e523e05f5b7e8f78465c71 (patch)
treef46bb3a4d29c2ee44400c42ef27db94bef2aee5f /bfd
parent75831f18a0326573a2116e1f57fa5c8e09bd7738 (diff)
downloadbinutils-gdb-5f51eb9397768a6d93e523e05f5b7e8f78465c71.tar.gz
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.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index 5c3b3c0eff4..c9abc2579e5 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -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)