/* ELF support for BFD.
- Copyright (C) 1991-2018 Free Software Foundation, Inc.
+ Copyright (C) 1991-2020 Free Software Foundation, Inc.
Written by Fred Fish @ Cygnus Support, from information published
in "UNIX System V Release 4, Programmers Guide: ANSI C and
/* Program header */
struct elf_internal_phdr {
- unsigned long p_type; /* Identifies program segment type */
- unsigned long p_flags; /* Segment flags */
- bfd_vma p_offset; /* Segment file offset */
- bfd_vma p_vaddr; /* Segment virtual address */
- bfd_vma p_paddr; /* Segment physical address */
- bfd_vma p_filesz; /* Segment size in file */
- bfd_vma p_memsz; /* Segment size in memory */
- bfd_vma p_align; /* Segment alignment, file & memory */
+ unsigned long p_type; /* Identifies program segment type. */
+ unsigned long p_flags; /* Segment flags. */
+ bfd_vma p_offset; /* Segment file offset in octets. */
+ bfd_vma p_vaddr; /* Segment virtual address in octets. */
+ bfd_vma p_paddr; /* Segment physical address in octets. */
+ bfd_vma p_filesz; /* Segment size in file in octets. */
+ bfd_vma p_memsz; /* Segment size in memory in octets. */
+ bfd_vma p_align; /* Segment alignment in bytes, file
+ & memory */
};
typedef struct elf_internal_phdr Elf_Internal_Phdr;
unsigned int sh_name; /* Section name, index in string tbl */
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 */
+ bfd_vma sh_addr; /* Section virtual addr at execution in
+ octets. */
+ file_ptr sh_offset; /* Section file offset in octets. */
+ bfd_size_type sh_size; /* Size of section in octets. */
unsigned int sh_link; /* Index of another section */
unsigned int sh_info; /* Additional section information */
bfd_vma sh_addralign; /* Section alignment */
unsigned long p_type;
/* Program segment flags. */
unsigned long p_flags;
- /* Program segment physical address. */
+ /* Program segment physical address in octets. */
bfd_vma p_paddr;
- /* Program segment virtual address offset from section vma. */
+ /* Program segment virtual address offset from section vma in bytes. */
bfd_vma p_vaddr_offset;
/* Program segment alignment. */
bfd_vma p_align;
- /* Segment size in file and memory */
+ /* Segment size in file and memory in octets. */
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;
unsigned int includes_filehdr : 1;
/* Whether this segment includes the program headers. */
unsigned int includes_phdrs : 1;
+ /* Assume this PT_LOAD header has an lma of zero when sorting
+ headers before assigning file offsets. PT_LOAD headers with this
+ flag set are placed after one with includes_filehdr set, and
+ before PT_LOAD headers without this flag set. */
+ unsigned int no_sort_lma : 1;
+ /* Index holding original order before sorting segments. */
+ unsigned int idx;
/* Number of sections (may be 0). */
unsigned int count;
/* Sections. Actual number of elements is in count field. */
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. */
+ sections won't match at the start or end of PT_DYNAMIC nor PT_NOTE,
+ unless PT_DYNAMIC and PT_NOTE are themselves 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. */ \
&& ((segment)->p_type == PT_LOAD \
|| (segment)->p_type == PT_DYNAMIC \
|| (segment)->p_type == PT_GNU_EH_FRAME \
+ || (segment)->p_type == PT_GNU_STACK \
|| (segment)->p_type == PT_GNU_RELRO \
- || (segment)->p_type == PT_GNU_STACK)) \
+ || ((segment)->p_type >= PT_GNU_MBIND_LO \
+ && (segment)->p_type <= PT_GNU_MBIND_HI))) \
/* Any section besides one of type SHT_NOBITS must have file \
offsets within the segment. */ \
&& ((sec_hdr)->sh_type == SHT_NOBITS \
&& (((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 \
+ /* No zero size sections at start or end of PT_DYNAMIC nor \
+ PT_NOTE. */ \
+ && (((segment)->p_type != PT_DYNAMIC \
+ && (segment)->p_type != PT_NOTE) \
|| (sec_hdr)->sh_size != 0 \
|| (segment)->p_memsz == 0 \
|| (((sec_hdr)->sh_type == SHT_NOBITS \