From dba143efb31cb98d480dc790bb9cde79b846fa32 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sat, 23 Mar 2002 13:14:33 +0000 Subject: [PATCH] * elf.c (_bfd_elf_make_section_from_shdr): Don't set lma based on section file offset for !SEC_LOAD sections. --- bfd/ChangeLog | 5 +++++ bfd/elf.c | 25 ++++++++++++++----------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 884499405a..3b5315033a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2002-03-23 Alan Modra + + * 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 * elf32-arm.h (elf32_arm_final_link_relocate case R_ARM_GOTOFF) diff --git a/bfd/elf.c b/bfd/elf.c index 5221f722f4..020771bcbc 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -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; } } -- 2.34.1