aboutsummaryrefslogtreecommitdiff
path: root/include/elf
diff options
context:
space:
mode:
Diffstat (limited to 'include/elf')
-rw-r--r--include/elf/ChangeLog5
-rw-r--r--include/elf/internal.h36
2 files changed, 23 insertions, 18 deletions
diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog
index 89deb48..c214009 100644
--- a/include/elf/ChangeLog
+++ b/include/elf/ChangeLog
@@ -1,3 +1,8 @@
+2007-05-02 Alan Modra <amodra@bigpond.net.au>
+
+ * internal.h (ELF_IS_SECTION_IN_SEGMENT): Check both file offset
+ and vma for appropriate sections.
+
2007-04-26 Jan Beulich <jbeulich@novell.com>
* common.h (DT_ENCODING): Correct value (back to spec mandated
diff --git a/include/elf/internal.h b/include/elf/internal.h
index f2161ff..1521711 100644
--- a/include/elf/internal.h
+++ b/include/elf/internal.h
@@ -1,6 +1,6 @@
/* ELF support for BFD.
Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002,
- 2003, 2006 Free Software Foundation, Inc.
+ 2003, 2006, 2007 Free Software Foundation, Inc.
Written by Fred Fish @ Cygnus Support, from information published
in "UNIX System V Release 4, Programmers Guide: ANSI C and
@@ -268,23 +268,23 @@ struct elf_segment_map
/* Decide if the given sec_hdr is in the given segment. PT_TLS segment
contains only SHF_TLS sections. Only PT_LOAD and PT_TLS segments
can contain SHF_TLS sections. */
-#define ELF_IS_SECTION_IN_SEGMENT(sec_hdr, segment) \
- (((((sec_hdr->sh_flags & SHF_TLS) != 0) \
- && (segment->p_type == PT_TLS \
- || segment->p_type == PT_LOAD)) \
- || ((sec_hdr->sh_flags & SHF_TLS) == 0 \
- && segment->p_type != PT_TLS)) \
- /* Compare allocated sec_hdrs by VMA, unallocated sec_hdrs \
- by file offset. */ \
- && (sec_hdr->sh_flags & SHF_ALLOC \
- ? (sec_hdr->sh_addr >= segment->p_vaddr \
- && (sec_hdr->sh_addr \
- + ELF_SECTION_SIZE(sec_hdr, segment) \
- <= segment->p_vaddr + segment->p_memsz)) \
- : ((bfd_vma) sec_hdr->sh_offset >= segment->p_offset \
- && (sec_hdr->sh_offset \
- + ELF_SECTION_SIZE(sec_hdr, segment) \
- <= segment->p_offset + segment->p_filesz))))
+#define ELF_IS_SECTION_IN_SEGMENT(sec_hdr, segment) \
+ (((((sec_hdr->sh_flags & SHF_TLS) != 0) \
+ && (segment->p_type == PT_TLS \
+ || segment->p_type == PT_LOAD)) \
+ || ((sec_hdr->sh_flags & SHF_TLS) == 0 \
+ && segment->p_type != PT_TLS)) \
+ /* Any section besides one of type SHT_NOBITS must have a file \
+ offset within the segment. */ \
+ && (sec_hdr->sh_type == SHT_NOBITS \
+ || ((bfd_vma) sec_hdr->sh_offset >= segment->p_offset \
+ && (sec_hdr->sh_offset + ELF_SECTION_SIZE(sec_hdr, segment) \
+ <= segment->p_offset + segment->p_filesz))) \
+ /* SHF_ALLOC sections must have VMAs within the segment. */ \
+ && ((sec_hdr->sh_flags & SHF_ALLOC) == 0 \
+ || (sec_hdr->sh_addr >= segment->p_vaddr \
+ && (sec_hdr->sh_addr + ELF_SECTION_SIZE(sec_hdr, segment) \
+ <= segment->p_vaddr + segment->p_memsz))))
/* Decide if the given sec_hdr is in the given segment in file. */
#define ELF_IS_SECTION_IN_SEGMENT_FILE(sec_hdr, segment) \