diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elf.c | 25 |
2 files changed, 19 insertions, 11 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8844994..3b53150 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2002-03-23 Alan Modra <amodra@bigpond.net.au> + + * elf.c (_bfd_elf_make_section_from_shdr): Don't set lma based on + section file offset for !SEC_LOAD sections. + 2002-03-21 Richard Earnshaw <rearnsha@arm.com> * elf32-arm.h (elf32_arm_final_link_relocate case R_ARM_GOTOFF) @@ -655,9 +655,9 @@ _bfd_elf_make_section_from_shdr (abfd, hdr, name) 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 + though, as a perfectly valid initialised segment can have a p_paddr of zero. Some architectures, eg ARM, - place special significance one the address 0 and + 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 @@ -668,15 +668,18 @@ _bfd_elf_make_section_from_shdr (abfd, hdr, name) || (phdr->p_offset + phdr->p_filesz >= hdr->sh_offset + hdr->sh_size))) { - /* We used to do a relative adjustment here, but - that doesn't work if the segment is packed with - code from multiple VMAs. Instead we calculate - the LMA absoultely, based on the LMA of the - segment (it is assumed that the segment will - contain sections with contiguous LMAs, even if - the VMAs are not). */ - newsect->lma = phdr->p_paddr - + hdr->sh_offset - phdr->p_offset; + if ((flags & SEC_LOAD) == 0) + newsect->lma += phdr->p_paddr - phdr->p_vaddr; + else + /* We used to use the same adjustment for SEC_LOAD + sections, but that doesn't work if the segment + is packed with code from multiple VMAs. + Instead we calculate the section LMA based on + the segment LMA. It is assumed that the + segment will contain sections with contiguous + LMAs, even if the VMAs are not. */ + newsect->lma = (phdr->p_paddr + + hdr->sh_offset - phdr->p_offset); break; } } |