* elf.c (_bfd_elf_make_section_from_shdr): When setting up section
	LMAs, use ELF_IS_SECTION_IN_SEGMENT to match sections with headers.
This commit is contained in:
Alan Modra 2009-08-08 01:43:28 +00:00
parent 93da6da6f9
commit e7e75368a3
2 changed files with 7 additions and 18 deletions

View File

@ -1,3 +1,9 @@
2009-08-08 Alan Modra <amodra@bigpond.net.au>
PR 10494
* elf.c (_bfd_elf_make_section_from_shdr): When setting up section
LMAs, use ELF_IS_SECTION_IN_SEGMENT to match sections with headers.
2009-08-07 Tom Tromey <tromey@redhat.com> 2009-08-07 Tom Tromey <tromey@redhat.com>
* elf32-microblaze.c (microblaze_elf_check_relocs): Avoid strict * elf32-microblaze.c (microblaze_elf_check_relocs): Avoid strict

View File

@ -971,25 +971,8 @@ _bfd_elf_make_section_from_shdr (bfd *abfd,
phdr = elf_tdata (abfd)->phdr; phdr = elf_tdata (abfd)->phdr;
for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++) for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
{ {
/* This section is part of this segment if its file
offset plus size lies within the segment's memory
span and, if the section is loaded, the extent of the
loaded data lies within the extent of the segment.
Note - we used to check the p_paddr field as well, and
refuse to set the LMA if it was 0. This is wrong
though, as a perfectly valid initialised segment can
have a p_paddr of zero. Some architectures, eg ARM,
place special significance on the address 0 and
executables need to be able to have a segment which
covers this address. */
if (phdr->p_type == PT_LOAD if (phdr->p_type == PT_LOAD
&& (bfd_vma) hdr->sh_offset >= phdr->p_offset && ELF_IS_SECTION_IN_SEGMENT (hdr, phdr))
&& (hdr->sh_offset + hdr->sh_size
<= phdr->p_offset + phdr->p_memsz)
&& ((flags & SEC_LOAD) == 0
|| (hdr->sh_offset + hdr->sh_size
<= phdr->p_offset + phdr->p_filesz)))
{ {
if ((flags & SEC_LOAD) == 0) if ((flags & SEC_LOAD) == 0)
newsect->lma = (phdr->p_paddr newsect->lma = (phdr->p_paddr