include/elf/
[deliverable/binutils-gdb.git] / include / elf / internal.h
index a7299d90534dc736247599cef3703cd562f6b752..cacfc63bf1fed0026bb78eb6c0c0f7e755687079 100644 (file)
@@ -1,6 +1,6 @@
 /* ELF support for BFD.
-   Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002
-   Free Software Foundation, Inc.
+   Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002,
+   2003, 2006, 2007, 2008 Free Software Foundation, Inc.
 
    Written by Fred Fish @ Cygnus Support, from information published
    in "UNIX System V Release 4, Programmers Guide: ANSI C and
@@ -20,7 +20,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 
 /* This file is part of ELF support for BFD, and contains the portions
@@ -37,6 +37,31 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #ifndef _ELF_INTERNAL_H
 #define _ELF_INTERNAL_H
 
+/* Special section indices, which may show up in st_shndx fields, among
+   other places.  */
+
+#undef SHN_UNDEF
+#undef SHN_LORESERVE
+#undef SHN_LOPROC
+#undef SHN_HIPROC
+#undef SHN_LOOS
+#undef SHN_HIOS
+#undef SHN_ABS
+#undef SHN_COMMON
+#undef SHN_XINDEX
+#undef SHN_HIRESERVE
+#define SHN_UNDEF      0               /* Undefined section reference */
+#define SHN_LORESERVE  (-0x100u)       /* Begin range of reserved indices */
+#define SHN_LOPROC     (-0x100u)       /* Begin range of appl-specific */
+#define SHN_HIPROC     (-0xE1u)        /* End range of appl-specific */
+#define SHN_LOOS       (-0xE0u)        /* OS specific semantics, lo */
+#define SHN_HIOS       (-0xC1u)        /* OS specific semantics, hi */
+#define SHN_ABS                (-0xFu)         /* Associated symbol is absolute */
+#define SHN_COMMON     (-0xEu)         /* Associated symbol is in common */
+#define SHN_XINDEX     (-0x1u)         /* Section index is held elsewhere */
+#define SHN_HIRESERVE  (-0x1u)         /* End range of reserved indices */
+#define SHN_BAD                (-0x101u)       /* Used internally by bfd */
+
 /* ELF Header */
 
 #define EI_NIDENT      16              /* Size of e_ident[] */
@@ -235,12 +260,24 @@ 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;
+  /* Segment size in file and memory */
+  bfd_vma p_size;
   /* Whether the p_flags field is valid; if not, the flags are based
      on the section flags.  */
   unsigned int p_flags_valid : 1;
   /* Whether the p_paddr field is valid; if not, the physical address
      is based on the section lma values.  */
   unsigned int p_paddr_valid : 1;
+  /* Whether the p_align field is valid; if not, PT_LOAD segment
+     alignment is based on the default maximum page size.  */
+  unsigned int p_align_valid : 1;
+  /* Whether the p_size field is valid; if not, the size are based
+     on the section sizes.  */
+  unsigned int p_size_valid : 1;
   /* Whether this segment includes the file header.  */
   unsigned int includes_filehdr : 1;
   /* Whether this segment includes the program headers.  */
@@ -251,4 +288,44 @@ struct elf_segment_map
   asection *sections[1];
 };
 
+/* .tbss is special.  It doesn't contribute memory space to normal
+   segments and it doesn't take file space in normal segments.  */
+#define ELF_SECTION_SIZE(sec_hdr, segment)                     \
+   (((sec_hdr->sh_flags & SHF_TLS) == 0                                \
+     || sec_hdr->sh_type != SHT_NOBITS                         \
+     || segment->p_type == PT_TLS) ? sec_hdr->sh_size : 0)
+
+/* Decide if the given sec_hdr is in the given segment.  PT_TLS segment
+   contains only SHF_TLS sections.  Only PT_LOAD, PT_GNU_RELRO and
+   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_GNU_RELRO                             \
+        || 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.  Be                \
+      careful about segments right at the end of memory.  */           \
+   && ((sec_hdr->sh_flags & SHF_ALLOC) == 0                            \
+       || (sec_hdr->sh_addr >= segment->p_vaddr                                \
+          && (sec_hdr->sh_addr - segment->p_vaddr                      \
+              + ELF_SECTION_SIZE(sec_hdr, segment) <= 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)       \
+  (sec_hdr->sh_size > 0                                                \
+   && ELF_IS_SECTION_IN_SEGMENT (sec_hdr, segment))
+
+/* Decide if the given sec_hdr is in the given segment in memory.  */
+#define ELF_IS_SECTION_IN_SEGMENT_MEMORY(sec_hdr, segment)     \
+  (ELF_SECTION_SIZE(sec_hdr, segment) > 0                      \
+   && ELF_IS_SECTION_IN_SEGMENT (sec_hdr, segment))
+
 #endif /* _ELF_INTERNAL_H */
This page took 0.027593 seconds and 4 git commands to generate.