Mention PR ld/4701.
[deliverable/binutils-gdb.git] / include / elf / internal.h
index d368a3fa6e7401a81cdfc7bd0f2d7883f3766945..152171136c198ba56118fb548caaaef53742cef9 100644 (file)
@@ -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
@@ -235,6 +235,8 @@ struct elf_segment_map
   unsigned long p_flags;
   /* Program segment physical address.  */
   bfd_vma p_paddr;
+  /* Program segment virtual address offset from section vma.  */
+  bfd_vma p_vaddr_offset;
   /* Program segment alignment.  */
   bfd_vma p_align;
   /* Whether the p_flags field is valid; if not, the flags are based
@@ -266,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)       \
This page took 0.025197 seconds and 4 git commands to generate.