]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - include/elf/internal.h
ChangeLog rotatation and copyright year update
[thirdparty/binutils-gdb.git] / include / elf / internal.h
index a7299d90534dc736247599cef3703cd562f6b752..04e0582ab50561a6b17938f48b42c5a64d6fcfa5 100644 (file)
@@ -1,34 +1,32 @@
 /* ELF support for BFD.
-   Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002
-   Free Software Foundation, Inc.
+   Copyright (C) 1991-2015 Free Software Foundation, Inc.
 
    Written by Fred Fish @ Cygnus Support, from information published
    in "UNIX System V Release 4, Programmers Guide: ANSI C and
    Programming Support Tools".
 
-This file is part of BFD, the Binary File Descriptor library.
+   This file is part of BFD, the Binary File Descriptor library.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-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.  */
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   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., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
 /* This file is part of ELF support for BFD, and contains the portions
    that describe how ELF is represented internally in the BFD library.
    I.E. it describes the in-memory representation of ELF.  It requires
    the elf-common.h file which contains the portions that are common to
-   both the internal and external representations. */
-
+   both the internal and external representations.  */
 
 /* NOTE that these structures are not kept in the same order as they appear
    in the object file.  In some cases they've been reordered for more optimal
@@ -37,6 +35,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[] */
@@ -80,12 +103,12 @@ typedef struct elf_internal_shdr {
   unsigned int sh_type;                /* Type of section */
   bfd_vma      sh_flags;               /* Miscellaneous section attributes */
   bfd_vma      sh_addr;                /* Section virtual addr at execution */
+  file_ptr     sh_offset;              /* Section file offset */
   bfd_size_type        sh_size;                /* Size of section in bytes */
+  unsigned int sh_link;                /* Index of another section */
+  unsigned int sh_info;                /* Additional section information */
+  bfd_vma      sh_addralign;           /* Section alignment */
   bfd_size_type        sh_entsize;             /* Entry size if section holds table */
-  unsigned long        sh_link;                /* Index of another section */
-  unsigned long        sh_info;                /* Additional section information */
-  file_ptr     sh_offset;              /* Section file offset */
-  unsigned int sh_addralign;           /* Section alignment */
 
   /* The internal rep also has some cached info associated with it. */
   asection *   bfd_section;            /* Associated BFD section.  */
@@ -100,6 +123,7 @@ struct elf_internal_sym {
   unsigned long        st_name;                /* Symbol name, index in string tbl */
   unsigned char        st_info;                /* Type and binding attributes */
   unsigned char        st_other;               /* Visibilty, and target specific */
+  unsigned char st_target_internal;    /* Internal-only information */
   unsigned int  st_shndx;              /* Associated section index */
 };
 
@@ -235,12 +259,26 @@ 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;
+  /* Required size of filehdr + phdrs, if non-zero */
+  bfd_vma header_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 +289,71 @@ 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_TBSS_SPECIAL(sec_hdr, segment)                     \
+  (((sec_hdr)->sh_flags & SHF_TLS) != 0                                \
+   && (sec_hdr)->sh_type == SHT_NOBITS                         \
+   && (segment)->p_type != PT_TLS)
+
+#define ELF_SECTION_SIZE(sec_hdr, segment)                     \
+  (ELF_TBSS_SPECIAL(sec_hdr, segment) ? 0 : (sec_hdr)->sh_size)
+
+/* Decide if the section SEC_HDR is in SEGMENT.  If CHECK_VMA, then
+   VMAs are checked for alloc sections.  If STRICT, then a zero size
+   section won't match at the end of a segment, unless the segment
+   is also zero size.  Regardless of STRICT and CHECK_VMA, zero size
+   sections won't match at the start or end of PT_DYNAMIC, unless
+   PT_DYNAMIC is itself zero sized.  */
+#define ELF_SECTION_IN_SEGMENT_1(sec_hdr, segment, check_vma, strict)  \
+  ((/* Only PT_LOAD, PT_GNU_RELRO and PT_TLS segments can contain      \
+       SHF_TLS sections.  */                                           \
+    ((((sec_hdr)->sh_flags & SHF_TLS) != 0)                            \
+     && ((segment)->p_type == PT_TLS                                   \
+        || (segment)->p_type == PT_GNU_RELRO                           \
+        || (segment)->p_type == PT_LOAD))                              \
+    /* PT_TLS segment contains only SHF_TLS sections, PT_PHDR no       \
+       sections at all.  */                                            \
+    || (((sec_hdr)->sh_flags & SHF_TLS) == 0                           \
+       && (segment)->p_type != PT_TLS                                  \
+       && (segment)->p_type != PT_PHDR))                               \
+   /* Any section besides one of type SHT_NOBITS must have file                \
+      offsets within the segment.  */                                  \
+   && ((sec_hdr)->sh_type == SHT_NOBITS                                        \
+       || ((bfd_vma) (sec_hdr)->sh_offset >= (segment)->p_offset       \
+          && (!(strict)                                                \
+              || ((sec_hdr)->sh_offset - (segment)->p_offset           \
+                  <= (segment)->p_filesz - 1))                         \
+          && (((sec_hdr)->sh_offset - (segment)->p_offset              \
+               + ELF_SECTION_SIZE(sec_hdr, segment))                   \
+              <= (segment)->p_filesz)))                                \
+   /* SHF_ALLOC sections must have VMAs within the segment.  */                \
+   && (!(check_vma)                                                    \
+       || ((sec_hdr)->sh_flags & SHF_ALLOC) == 0                       \
+       || ((sec_hdr)->sh_addr >= (segment)->p_vaddr                    \
+          && (!(strict)                                                \
+              || ((sec_hdr)->sh_addr - (segment)->p_vaddr              \
+                  <= (segment)->p_memsz - 1))                          \
+          && (((sec_hdr)->sh_addr - (segment)->p_vaddr                 \
+               + ELF_SECTION_SIZE(sec_hdr, segment))                   \
+              <= (segment)->p_memsz)))                                 \
+   /* No zero size sections at start or end of PT_DYNAMIC.  */         \
+   && ((segment)->p_type != PT_DYNAMIC                                 \
+       || (sec_hdr)->sh_size != 0                                      \
+       || (segment)->p_memsz == 0                                      \
+       || (((sec_hdr)->sh_type == SHT_NOBITS                           \
+           || ((bfd_vma) (sec_hdr)->sh_offset > (segment)->p_offset    \
+               && ((sec_hdr)->sh_offset - (segment)->p_offset          \
+                   < (segment)->p_filesz)))                            \
+          && (((sec_hdr)->sh_flags & SHF_ALLOC) == 0                   \
+              || ((sec_hdr)->sh_addr > (segment)->p_vaddr              \
+                  && ((sec_hdr)->sh_addr - (segment)->p_vaddr          \
+                      < (segment)->p_memsz))))))
+
+#define ELF_SECTION_IN_SEGMENT(sec_hdr, segment)                       \
+  (ELF_SECTION_IN_SEGMENT_1 (sec_hdr, segment, 1, 0))
+
+#define ELF_SECTION_IN_SEGMENT_STRICT(sec_hdr, segment)                        \
+  (ELF_SECTION_IN_SEGMENT_1 (sec_hdr, segment, 1, 1))
+
 #endif /* _ELF_INTERNAL_H */