elf: Reset alignment for each PT_LOAD segment

Reset alignment for each PT_LOAD segment to avoid using alignment from
the previous PT_LOAD segment.

bfd/

	PR ld/29435
	* elf.c (assign_file_positions_for_load_sections): Reset
	alignment for each PT_LOAD segment.

ld/

	PR ld/29435
	* testsuite/ld-elf/pr29435.d: New file.
	* testsuite/ld-elf/pr29435.s: Likewise.
This commit is contained in:
H.J. Lu
2022-08-01 16:02:39 -07:00
parent 88c4cce8d2
commit 59f214544c
3 changed files with 21 additions and 3 deletions

View File

@@ -5440,8 +5440,6 @@ assign_file_positions_for_load_sections (bfd *abfd,
Elf_Internal_Phdr *p;
file_ptr off; /* Octets. */
bfd_size_type maxpagesize;
bfd_size_type p_align;
bool p_align_p = false;
unsigned int alloc, actual;
unsigned int i, j;
struct elf_segment_map **sorted_seg_map;
@@ -5526,7 +5524,6 @@ assign_file_positions_for_load_sections (bfd *abfd,
qsort (sorted_seg_map, alloc, sizeof (*sorted_seg_map),
elf_sort_segments);
p_align = bed->p_align;
maxpagesize = 1;
if ((abfd->flags & D_PAGED) != 0)
{
@@ -5561,6 +5558,8 @@ assign_file_positions_for_load_sections (bfd *abfd,
asection **secpp;
bfd_vma off_adjust; /* Octets. */
bool no_contents;
bfd_size_type p_align;
bool p_align_p;
/* An ELF segment (described by Elf_Internal_Phdr) may contain a
number of sections with contents contributing to both p_filesz
@@ -5571,6 +5570,8 @@ assign_file_positions_for_load_sections (bfd *abfd,
p = phdrs + m->idx;
p->p_type = m->p_type;
p->p_flags = m->p_flags;
p_align = bed->p_align;
p_align_p = false;
if (m->count == 0)
p->p_vaddr = m->p_vaddr_offset * opb;

View File

@@ -0,0 +1,11 @@
#ld: -shared -z separate-code -z relro
#xfail: ![check_shared_lib_support]
#xfail: ![check_relro_support]
#readelf: -Wl
#failif
#...
+LOAD +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ .* 0x8000
#...
+LOAD +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ .* 0x8000
#...

View File

@@ -0,0 +1,6 @@
.text
.balign 0x8000
.globl foo
.type foo, %function
foo:
.byte 0