colibri_imx6: fix video stdout in default environment
[oweals/u-boot.git] / include / elf.h
index a9839df3f2bdc74bce5e0f89f275c26fd1bd098a..b04e746d6176bd37abc30fe775d4dcf97742e886 100644 (file)
@@ -1,66 +1,36 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
 /*
  * Copyright (c) 1995, 1996, 2001, 2002
  * Erik Theisen.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-/*
- * This is the ELF ABI header file
- * formerly known as "elf_abi.h".
- */
+/* This is the ELF ABI header file formerly known as "elf_abi.h" */
 
 #ifndef _ELF_H
 #define _ELF_H
 
-#if defined(__BEOS__)   || \
-    defined(__NetBSD__)  || \
-    defined(__FreeBSD__) || \
-    defined(__sun__)    || \
-    defined(__APPLE__)
-#include <inttypes.h>
-#elif defined(__linux__) && defined(USE_HOSTCC)
-#include <stdint.h>
-#elif defined(__WIN32__)
-#include <unistd.h>
-typedef         unsigned char   uint8_t;
-typedef         unsigned short  uint16_t;
-typedef         unsigned int    uint32_t;
-#endif
+#ifndef __ASSEMBLY__
+#include "compiler.h"
 
-/*
- *  This version doesn't work for 64-bit ABIs - Erik.
- */
+/* This version doesn't work for 64-bit ABIs - Erik */
 
-/*
- * These typedefs need to be handled better.
- */
+/* These typedefs need to be handled better */
 typedef uint32_t       Elf32_Addr;     /* Unsigned program address */
 typedef uint32_t       Elf32_Off;      /* Unsigned file offset */
 typedef int32_t                Elf32_Sword;    /* Signed large integer */
 typedef uint32_t       Elf32_Word;     /* Unsigned large integer */
 typedef uint16_t       Elf32_Half;     /* Unsigned medium integer */
 
+/* 64-bit ELF base types */
+typedef uint64_t       Elf64_Addr;
+typedef uint16_t       Elf64_Half;
+typedef int16_t                Elf64_SHalf;
+typedef uint64_t       Elf64_Off;
+typedef int32_t                Elf64_Sword;
+typedef uint32_t       Elf64_Word;
+typedef uint64_t       Elf64_Xword;
+typedef int64_t                Elf64_Sxword;
+
 /* e_ident[] identification indexes */
 #define EI_MAG0                0               /* file ID */
 #define EI_MAG1                1               /* file ID */
@@ -118,7 +88,7 @@ typedef uint16_t     Elf32_Half;     /* Unsigned medium integer */
                      (ehdr).e_ident[EI_MAG3] == ELFMAG3)
 
 /* ELF Header */
-typedef struct elfhdr{
+typedef struct {
        unsigned char   e_ident[EI_NIDENT]; /* ELF Identification */
        Elf32_Half      e_type;         /* object file type */
        Elf32_Half      e_machine;      /* machine */
@@ -136,6 +106,24 @@ typedef struct elfhdr{
                                           header string table" entry offset */
 } Elf32_Ehdr;
 
+typedef struct {
+       unsigned char   e_ident[EI_NIDENT]; /* ELF Identification */
+       Elf64_Half      e_type;         /* object file type */
+       Elf64_Half      e_machine;      /* machine */
+       Elf64_Word      e_version;      /* object file version */
+       Elf64_Addr      e_entry;        /* virtual entry point */
+       Elf64_Off       e_phoff;        /* program header table offset */
+       Elf64_Off       e_shoff;        /* section header table offset */
+       Elf64_Word      e_flags;        /* processor-specific flags */
+       Elf64_Half      e_ehsize;       /* ELF header size */
+       Elf64_Half      e_phentsize;    /* program header entry size */
+       Elf64_Half      e_phnum;        /* number of program header entries */
+       Elf64_Half      e_shentsize;    /* section header entry size */
+       Elf64_Half      e_shnum;        /* number of section header entries */
+       Elf64_Half      e_shstrndx;     /* section header table's "section
+                                          header string table" entry offset */
+} Elf64_Ehdr;
+
 /* e_type */
 #define ET_NONE                0               /* No file type */
 #define ET_REL         1               /* relocatable file */
@@ -144,9 +132,9 @@ typedef struct elfhdr{
 #define ET_CORE                4               /* core file */
 #define ET_NUM         5               /* number of types */
 #define ET_LOOS                0xfe00          /* reserved range for operating */
-#define ET_HIOS                0xfeff          /*  system specific e_type */
+#define ET_HIOS                0xfeff          /* system specific e_type */
 #define ET_LOPROC      0xff00          /* reserved range for processor */
-#define ET_HIPROC      0xffff          /*  specific e_type */
+#define ET_HIPROC      0xffff          /* specific e_type */
 
 /* e_machine */
 #define EM_NONE                0               /* No Machine */
@@ -253,13 +241,27 @@ typedef struct {
        Elf32_Word      sh_entsize;     /* section entry size */
 } Elf32_Shdr;
 
+typedef struct {
+       Elf64_Word      sh_name;        /* name - index into section header
+                                          string table section */
+       Elf64_Word      sh_type;        /* type */
+       Elf64_Xword     sh_flags;       /* flags */
+       Elf64_Addr      sh_addr;        /* address */
+       Elf64_Off       sh_offset;      /* file offset */
+       Elf64_Xword     sh_size;        /* section size */
+       Elf64_Word      sh_link;        /* section header table index link */
+       Elf64_Word      sh_info;        /* extra information */
+       Elf64_Xword     sh_addralign;   /* address alignment */
+       Elf64_Xword     sh_entsize;     /* section entry size */
+} Elf64_Shdr;
+
 /* Special Section Indexes */
 #define SHN_UNDEF      0               /* undefined */
 #define SHN_LORESERVE  0xff00          /* lower bounds of reserved indexes */
 #define SHN_LOPROC     0xff00          /* reserved range for processor */
-#define SHN_HIPROC     0xff1f          /*   specific section indexes */
+#define SHN_HIPROC     0xff1f          /* specific section indexes */
 #define SHN_LOOS       0xff20          /* reserved range for operating */
-#define SHN_HIOS       0xff3f          /*   specific semantics */
+#define SHN_HIOS       0xff3f          /* specific semantics */
 #define SHN_ABS                0xfff1          /* absolute value */
 #define SHN_COMMON     0xfff2          /* common symbol */
 #define SHN_XINDEX     0xffff          /* Index is an extra table */
@@ -287,46 +289,46 @@ typedef struct {
 #define SHT_LOOS       0x60000000      /* Start OS-specific */
 #define SHT_HIOS       0x6fffffff      /* End OS-specific */
 #define SHT_LOPROC     0x70000000      /* reserved range for processor */
-#define SHT_HIPROC     0x7fffffff      /*  specific section header types */
+#define SHT_HIPROC     0x7fffffff      /* specific section header types */
 #define SHT_LOUSER     0x80000000      /* reserved range for application */
-#define SHT_HIUSER     0xffffffff      /*  specific indexes */
+#define SHT_HIUSER     0xffffffff      /* specific indexes */
 
 /* Section names */
-#define ELF_BSS         ".bss"         /* uninitialized data */
+#define ELF_BSS                ".bss"          /* uninitialized data */
 #define ELF_COMMENT    ".comment"      /* version control information */
-#define ELF_DATA        ".data"                /* initialized data */
-#define ELF_DATA1       ".data1"       /* initialized data */
-#define ELF_DEBUG       ".debug"       /* debug */
-#define ELF_DYNAMIC     ".dynamic"     /* dynamic linking information */
-#define ELF_DYNSTR      ".dynstr"      /* dynamic string table */
-#define ELF_DYNSYM      ".dynsym"      /* dynamic symbol table */
-#define ELF_FINI        ".fini"                /* termination code */
+#define ELF_DATA       ".data"         /* initialized data */
+#define ELF_DATA1      ".data1"        /* initialized data */
+#define ELF_DEBUG      ".debug"        /* debug */
+#define ELF_DYNAMIC    ".dynamic"      /* dynamic linking information */
+#define ELF_DYNSTR     ".dynstr"       /* dynamic string table */
+#define ELF_DYNSYM     ".dynsym"       /* dynamic symbol table */
+#define ELF_FINI       ".fini"         /* termination code */
 #define ELF_FINI_ARRAY ".fini_array"   /* Array of destructors */
-#define ELF_GOT         ".got"         /* global offset table */
-#define ELF_HASH        ".hash"                /* symbol hash table */
-#define ELF_INIT        ".init"                /* initialization code */
+#define ELF_GOT                ".got"          /* global offset table */
+#define ELF_HASH       ".hash"         /* symbol hash table */
+#define ELF_INIT       ".init"         /* initialization code */
 #define ELF_INIT_ARRAY ".init_array"   /* Array of constuctors */
 #define ELF_INTERP     ".interp"       /* Pathname of program interpreter */
 #define ELF_LINE       ".line"         /* Symbolic line numnber information */
 #define ELF_NOTE       ".note"         /* Contains note section */
 #define ELF_PLT                ".plt"          /* Procedure linkage table */
 #define ELF_PREINIT_ARRAY ".preinit_array" /* Array of pre-constructors */
-#define ELF_REL_DATA    ".rel.data"    /* relocation data */
-#define ELF_REL_FINI    ".rel.fini"    /* relocation termination code */
-#define ELF_REL_INIT    ".rel.init"    /* relocation initialization code */
-#define ELF_REL_DYN     ".rel.dyn"     /* relocaltion dynamic link info */
-#define ELF_REL_RODATA  ".rel.rodata"  /* relocation read-only data */
-#define ELF_REL_TEXT    ".rel.text"    /* relocation code */
-#define ELF_RODATA      ".rodata"      /* read-only data */
-#define ELF_RODATA1     ".rodata1"     /* read-only data */
-#define ELF_SHSTRTAB    ".shstrtab"    /* section header string table */
-#define ELF_STRTAB      ".strtab"      /* string table */
-#define ELF_SYMTAB      ".symtab"      /* symbol table */
+#define ELF_REL_DATA   ".rel.data"     /* relocation data */
+#define ELF_REL_FINI   ".rel.fini"     /* relocation termination code */
+#define ELF_REL_INIT   ".rel.init"     /* relocation initialization code */
+#define ELF_REL_DYN    ".rel.dyn"      /* relocaltion dynamic link info */
+#define ELF_REL_RODATA ".rel.rodata"   /* relocation read-only data */
+#define ELF_REL_TEXT   ".rel.text"     /* relocation code */
+#define ELF_RODATA     ".rodata"       /* read-only data */
+#define ELF_RODATA1    ".rodata1"      /* read-only data */
+#define ELF_SHSTRTAB   ".shstrtab"     /* section header string table */
+#define ELF_STRTAB     ".strtab"       /* string table */
+#define ELF_SYMTAB     ".symtab"       /* symbol table */
 #define ELF_SYMTAB_SHNDX ".symtab_shndx"/* symbol table section index */
 #define ELF_TBSS       ".tbss"         /* thread local uninit data */
 #define ELF_TDATA      ".tdata"        /* thread local init data */
 #define ELF_TDATA1     ".tdata1"       /* thread local init data */
-#define ELF_TEXT        ".text"                /* code */
+#define ELF_TEXT       ".text"         /* code */
 
 /* Section Attribute Flags - sh_flags */
 #define SHF_WRITE      0x1             /* Writable */
@@ -341,7 +343,7 @@ typedef struct {
 #define SHF_TLS                0x400           /* Thread local storage */
 #define SHF_MASKOS     0x0ff00000      /* OS specific */
 #define SHF_MASKPROC   0xf0000000      /* reserved bits for processor */
-                                       /*  specific section attributes */
+                                       /* specific section attributes */
 
 /* Section Group Flags */
 #define GRP_COMDAT     0x1             /* COMDAT group */
@@ -349,7 +351,7 @@ typedef struct {
 #define GRP_MASKPROC   0xf0000000      /* Mask processor specific flags */
 
 /* Symbol Table Entry */
-typedef struct elf32_sym {
+typedef struct {
        Elf32_Word      st_name;        /* name - index into string table */
        Elf32_Addr      st_value;       /* symbol value */
        Elf32_Word      st_size;        /* symbol size */
@@ -373,9 +375,9 @@ typedef struct elf32_sym {
 #define STB_WEAK       2               /* like global - lower precedence */
 #define STB_NUM                3               /* number of symbol bindings */
 #define STB_LOOS       10              /* reserved range for operating */
-#define STB_HIOS       12              /*   system specific symbol bindings */
+#define STB_HIOS       12              /* system specific symbol bindings */
 #define STB_LOPROC     13              /* reserved range for processor */
-#define STB_HIPROC     15              /*  specific symbol bindings */
+#define STB_HIPROC     15              /* specific symbol bindings */
 
 /* Symbol type - ELF32_ST_TYPE - st_info */
 #define STT_NOTYPE     0               /* not specified */
@@ -386,9 +388,9 @@ typedef struct elf32_sym {
 #define STT_NUM                5               /* number of symbol types */
 #define STT_TLS                6               /* Thread local storage symbol */
 #define STT_LOOS       10              /* reserved range for operating */
-#define STT_HIOS       12              /*  system specific symbol types */
+#define STT_HIOS       12              /* system specific symbol types */
 #define STT_LOPROC     13              /* reserved range for processor */
-#define STT_HIPROC     15              /*  specific symbol types */
+#define STT_HIPROC     15              /* specific symbol types */
 
 /* Symbol visibility - ELF32_ST_VISIBILITY - st_other */
 #define STV_DEFAULT    0               /* Normal visibility rules */
@@ -396,22 +398,30 @@ typedef struct elf32_sym {
 #define STV_HIDDEN     2               /* Symbol unavailable in other mods */
 #define STV_PROTECTED  3               /* Not preemptible, not exported */
 
-
 /* Relocation entry with implicit addend */
-typedef struct
-{
+typedef struct {
        Elf32_Addr      r_offset;       /* offset of relocation */
        Elf32_Word      r_info;         /* symbol table index and type */
 } Elf32_Rel;
 
 /* Relocation entry with explicit addend */
-typedef struct
-{
+typedef struct {
        Elf32_Addr      r_offset;       /* offset of relocation */
        Elf32_Word      r_info;         /* symbol table index and type */
        Elf32_Sword     r_addend;
 } Elf32_Rela;
 
+typedef struct {
+       Elf64_Addr r_offset;    /* Location at which to apply the action */
+       Elf64_Xword r_info;     /* index and type of relocation */
+} Elf64_Rel;
+
+typedef struct {
+       Elf64_Addr r_offset;    /* Location at which to apply the action */
+       Elf64_Xword r_info;     /* index and type of relocation */
+       Elf64_Sxword r_addend;  /* Constant addend used to compute value */
+} Elf64_Rela;
+
 /* Extract relocation info - r_info */
 #define ELF32_R_SYM(i)         ((i) >> 8)
 #define ELF32_R_TYPE(i)                ((unsigned char) (i))
@@ -422,13 +432,24 @@ typedef struct {
        Elf32_Word      p_type;         /* segment type */
        Elf32_Off       p_offset;       /* segment offset */
        Elf32_Addr      p_vaddr;        /* virtual address of segment */
-       Elf32_Addr      p_paddr;        /* physical address - ignored? */
-       Elf32_Word      p_filesz;       /* number of bytes in file for seg. */
-       Elf32_Word      p_memsz;        /* number of bytes in mem. for seg. */
+       Elf32_Addr      p_paddr;        /* physical address of segment */
+       Elf32_Word      p_filesz;       /* number of bytes in file for seg */
+       Elf32_Word      p_memsz;        /* number of bytes in mem. for seg */
        Elf32_Word      p_flags;        /* flags */
        Elf32_Word      p_align;        /* memory alignment */
 } Elf32_Phdr;
 
+typedef struct {
+       Elf64_Word      p_type;         /* segment type */
+       Elf64_Word      p_flags;        /* flags */
+       Elf64_Off       p_offset;       /* segment offset */
+       Elf64_Addr      p_vaddr;        /* virtual address of segment */
+       Elf64_Addr      p_paddr;        /* physical address of segment */
+       Elf64_Xword     p_filesz;       /* number of bytes in file for seg */
+       Elf64_Xword     p_memsz;        /* number of bytes in mem. for seg */
+       Elf64_Xword     p_align;        /* memory alignment */
+} Elf64_Phdr;
+
 /* Segment types - p_type */
 #define PT_NULL                0               /* unused */
 #define PT_LOAD                1               /* loadable segment */
@@ -440,9 +461,9 @@ typedef struct {
 #define PT_TLS         7               /* Thread local storage template */
 #define PT_NUM         8               /* Number of segment types */
 #define PT_LOOS                0x60000000      /* reserved range for operating */
-#define PT_HIOS                0x6fffffff      /*   system specific segment types */
+#define PT_HIOS                0x6fffffff      /* system specific segment types */
 #define PT_LOPROC      0x70000000      /* reserved range for processor */
-#define PT_HIPROC      0x7fffffff      /*  specific segment types */
+#define PT_HIPROC      0x7fffffff      /* specific segment types */
 
 /* Segment flags - p_flags */
 #define PF_X           0x1             /* Executable */
@@ -450,13 +471,11 @@ typedef struct {
 #define PF_R           0x4             /* Readable */
 #define PF_MASKOS      0x0ff00000      /* OS specific segment flags */
 #define PF_MASKPROC    0xf0000000      /* reserved bits for processor */
-                                       /*  specific segment flags */
+                                       /* specific segment flags */
 /* Dynamic structure */
-typedef struct
-{
+typedef struct {
        Elf32_Sword     d_tag;          /* controls meaning of d_val */
-       union
-       {
+       union {
                Elf32_Word      d_val;  /* Multiple meanings - see d_tag */
                Elf32_Addr      d_ptr;  /* program virtual address */
        } d_un;
@@ -464,6 +483,17 @@ typedef struct
 
 extern Elf32_Dyn       _DYNAMIC[];
 
+typedef struct {
+       Elf64_Sxword d_tag;             /* entry tag value */
+       union {
+               Elf64_Xword d_val;
+               Elf64_Addr d_ptr;
+       } d_un;
+} Elf64_Dyn;
+
+#define ELF64_R_SYM(i)                 ((i) >> 32)
+#define ELF64_R_TYPE(i)                        ((i) & 0xffffffff)
+
 /* Dynamic Array Tags - d_tag */
 #define DT_NULL                0               /* marks end of _DYNAMIC array */
 #define DT_NEEDED      1               /* string table offset of needed lib */
@@ -477,12 +507,12 @@ extern Elf32_Dyn  _DYNAMIC[];
 #define DT_RELAENT     9               /* size of relocation entry */
 #define DT_STRSZ       10              /* size of string table */
 #define DT_SYMENT      11              /* size of symbol table entry */
-#define DT_INIT                12              /* address of initialization func. */
+#define DT_INIT                12              /* address of initialization func */
 #define DT_FINI                13              /* address of termination function */
 #define DT_SONAME      14              /* string table offset of shared obj */
 #define DT_RPATH       15              /* string table offset of library
                                           search path */
-#define DT_SYMBOLIC    16              /* start sym search in shared obj. */
+#define DT_SYMBOLIC    16              /* start sym search in shared obj */
 #define DT_REL         17              /* address of rel. tbl. w addends */
 #define DT_RELSZ       18              /* size of DT_REL relocation table */
 #define DT_RELENT      19              /* size of DT_REL relocation entry */
@@ -500,11 +530,11 @@ extern Elf32_Dyn  _DYNAMIC[];
 #define DT_ENCODING    32              /* Start of encoded range */
 #define DT_PREINIT_ARRAY 32            /* Array with addresses of preinit fct*/
 #define DT_PREINIT_ARRAYSZ 33          /* size in bytes of DT_PREINIT_ARRAY */
-#define DT_NUM         34              /* Number used. */
+#define DT_NUM         34              /* Number used */
 #define DT_LOOS                0x60000000      /* reserved range for OS */
-#define DT_HIOS                0x6fffffff      /*   specific dynamic array tags */
+#define DT_HIOS                0x6fffffff      /* specific dynamic array tags */
 #define DT_LOPROC      0x70000000      /* reserved range for processor */
-#define DT_HIPROC      0x7fffffff      /*  specific dynamic array tags */
+#define DT_HIPROC      0x7fffffff      /* specific dynamic array tags */
 
 /* Dynamic Tag Flags - d_un.d_val */
 #define DF_ORIGIN      0x01            /* Object may use DF_ORIGIN */
@@ -518,89 +548,154 @@ unsigned long elf_hash(const unsigned char *name);
 
 #define ELF_TARG_VER   1       /* The ver for which this code is intended */
 
+#endif /* __ASSEMBLER */
+
+/* ELF register definitions */
+#define R_386_NONE     0
+#define R_386_32       1
+#define R_386_PC32     2
+#define R_386_GOT32    3
+#define R_386_PLT32    4
+#define R_386_COPY     5
+#define R_386_GLOB_DAT 6
+#define R_386_JMP_SLOT 7
+#define R_386_RELATIVE 8
+#define R_386_GOTOFF   9
+#define R_386_GOTPC    10
+#define R_386_NUM      11
+
+/* x86-64 relocation types */
+#define R_X86_64_NONE          0       /* No reloc */
+#define R_X86_64_64            1       /* Direct 64 bit  */
+#define R_X86_64_PC32          2       /* PC relative 32 bit signed */
+#define R_X86_64_GOT32         3       /* 32 bit GOT entry */
+#define R_X86_64_PLT32         4       /* 32 bit PLT address */
+#define R_X86_64_COPY          5       /* Copy symbol at runtime */
+#define R_X86_64_GLOB_DAT      6       /* Create GOT entry */
+#define R_X86_64_JUMP_SLOT     7       /* Create PLT entry */
+#define R_X86_64_RELATIVE      8       /* Adjust by program base */
+/* 32 bit signed pc relative offset to GOT */
+#define R_X86_64_GOTPCREL      9
+#define R_X86_64_32            10      /* Direct 32 bit zero extended */
+#define R_X86_64_32S           11      /* Direct 32 bit sign extended */
+#define R_X86_64_16            12      /* Direct 16 bit zero extended */
+#define R_X86_64_PC16          13      /* 16 bit sign extended pc relative */
+#define R_X86_64_8             14      /* Direct 8 bit sign extended  */
+#define R_X86_64_PC8           15      /* 8 bit sign extended pc relative */
+
+#define R_X86_64_NUM           16
+
 /*
  * XXX - PowerPC defines really don't belong in here,
  * but we'll put them in for simplicity.
  */
 
-/* Values for Elf32/64_Ehdr.e_flags.  */
-#define EF_PPC_EMB              0x80000000      /* PowerPC embedded flag */
+/* Values for Elf32/64_Ehdr.e_flags */
+#define EF_PPC_EMB             0x80000000      /* PowerPC embedded flag */
+
+#define EF_PPC64_ELFV1_ABI     0x00000001
+#define EF_PPC64_ELFV2_ABI     0x00000002
 
 /* Cygnus local bits below */
-#define EF_PPC_RELOCATABLE      0x00010000      /* PowerPC -mrelocatable flag*/
-#define EF_PPC_RELOCATABLE_LIB  0x00008000      /* PowerPC -mrelocatable-lib
+#define EF_PPC_RELOCATABLE     0x00010000      /* PowerPC -mrelocatable flag*/
+#define EF_PPC_RELOCATABLE_LIB 0x00008000      /* PowerPC -mrelocatable-lib
                                                   flag */
 
 /* PowerPC relocations defined by the ABIs */
-#define R_PPC_NONE              0
-#define R_PPC_ADDR32            1       /* 32bit absolute address */
-#define R_PPC_ADDR24            2       /* 26bit address, 2 bits ignored.  */
-#define R_PPC_ADDR16            3       /* 16bit absolute address */
-#define R_PPC_ADDR16_LO         4       /* lower 16bit of absolute address */
-#define R_PPC_ADDR16_HI         5       /* high 16bit of absolute address */
-#define R_PPC_ADDR16_HA         6       /* adjusted high 16bit */
-#define R_PPC_ADDR14            7       /* 16bit address, 2 bits ignored */
-#define R_PPC_ADDR14_BRTAKEN    8
-#define R_PPC_ADDR14_BRNTAKEN   9
-#define R_PPC_REL24             10      /* PC relative 26 bit */
-#define R_PPC_REL14             11      /* PC relative 16 bit */
-#define R_PPC_REL14_BRTAKEN     12
-#define R_PPC_REL14_BRNTAKEN    13
-#define R_PPC_GOT16             14
-#define R_PPC_GOT16_LO          15
-#define R_PPC_GOT16_HI          16
-#define R_PPC_GOT16_HA          17
-#define R_PPC_PLTREL24          18
-#define R_PPC_COPY              19
-#define R_PPC_GLOB_DAT          20
-#define R_PPC_JMP_SLOT          21
-#define R_PPC_RELATIVE          22
-#define R_PPC_LOCAL24PC         23
-#define R_PPC_UADDR32           24
-#define R_PPC_UADDR16           25
-#define R_PPC_REL32             26
-#define R_PPC_PLT32             27
-#define R_PPC_PLTREL32          28
-#define R_PPC_PLT16_LO          29
-#define R_PPC_PLT16_HI          30
-#define R_PPC_PLT16_HA          31
-#define R_PPC_SDAREL16          32
-#define R_PPC_SECTOFF           33
-#define R_PPC_SECTOFF_LO        34
-#define R_PPC_SECTOFF_HI        35
-#define R_PPC_SECTOFF_HA        36
-/* Keep this the last entry.  */
-#define R_PPC_NUM               37
-
-/* The remaining relocs are from the Embedded ELF ABI, and are not
-   in the SVR4 ELF ABI.  */
-#define R_PPC_EMB_NADDR32       101
-#define R_PPC_EMB_NADDR16       102
-#define R_PPC_EMB_NADDR16_LO    103
-#define R_PPC_EMB_NADDR16_HI    104
-#define R_PPC_EMB_NADDR16_HA    105
-#define R_PPC_EMB_SDAI16        106
-#define R_PPC_EMB_SDA2I16       107
-#define R_PPC_EMB_SDA2REL       108
-#define R_PPC_EMB_SDA21         109     /* 16 bit offset in SDA */
-#define R_PPC_EMB_MRKREF        110
-#define R_PPC_EMB_RELSEC16      111
-#define R_PPC_EMB_RELST_LO      112
-#define R_PPC_EMB_RELST_HI      113
-#define R_PPC_EMB_RELST_HA      114
-#define R_PPC_EMB_BIT_FLD       115
-#define R_PPC_EMB_RELSDA        116     /* 16 bit relative offset in SDA */
-
-/* Diab tool relocations.  */
-#define R_PPC_DIAB_SDA21_LO     180     /* like EMB_SDA21, but lower 16 bit */
-#define R_PPC_DIAB_SDA21_HI     181     /* like EMB_SDA21, but high 16 bit */
-#define R_PPC_DIAB_SDA21_HA     182     /* like EMB_SDA21, adjusted high 16 */
-#define R_PPC_DIAB_RELSDA_LO    183     /* like EMB_RELSDA, but lower 16 bit */
-#define R_PPC_DIAB_RELSDA_HI    184     /* like EMB_RELSDA, but high 16 bit */
-#define R_PPC_DIAB_RELSDA_HA    185     /* like EMB_RELSDA, adjusted high 16 */
-
-/* This is a phony reloc to handle any old fashioned TOC16 references
-   that may still be in object files.  */
-#define R_PPC_TOC16             255
+#define R_PPC_NONE             0
+#define R_PPC_ADDR32           1       /* 32bit absolute address */
+#define R_PPC_ADDR24           2       /* 26bit address, 2 bits ignored */
+#define R_PPC_ADDR16           3       /* 16bit absolute address */
+#define R_PPC_ADDR16_LO                4       /* lower 16bit of absolute address */
+#define R_PPC_ADDR16_HI                5       /* high 16bit of absolute address */
+#define R_PPC_ADDR16_HA                6       /* adjusted high 16bit */
+#define R_PPC_ADDR14           7       /* 16bit address, 2 bits ignored */
+#define R_PPC_ADDR14_BRTAKEN   8
+#define R_PPC_ADDR14_BRNTAKEN  9
+#define R_PPC_REL24            10      /* PC relative 26 bit */
+#define R_PPC_REL14            11      /* PC relative 16 bit */
+#define R_PPC_REL14_BRTAKEN    12
+#define R_PPC_REL14_BRNTAKEN   13
+#define R_PPC_GOT16            14
+#define R_PPC_GOT16_LO         15
+#define R_PPC_GOT16_HI         16
+#define R_PPC_GOT16_HA         17
+#define R_PPC_PLTREL24         18
+#define R_PPC_COPY             19
+#define R_PPC_GLOB_DAT         20
+#define R_PPC_JMP_SLOT         21
+#define R_PPC_RELATIVE         22
+#define R_PPC_LOCAL24PC                23
+#define R_PPC_UADDR32          24
+#define R_PPC_UADDR16          25
+#define R_PPC_REL32            26
+#define R_PPC_PLT32            27
+#define R_PPC_PLTREL32         28
+#define R_PPC_PLT16_LO         29
+#define R_PPC_PLT16_HI         30
+#define R_PPC_PLT16_HA         31
+#define R_PPC_SDAREL16         32
+#define R_PPC_SECTOFF          33
+#define R_PPC_SECTOFF_LO       34
+#define R_PPC_SECTOFF_HI       35
+#define R_PPC_SECTOFF_HA       36
+/* Keep this the last entry */
+#define R_PPC_NUM              37
+
+/*
+ * The remaining relocs are from the Embedded ELF ABI, and are not
+ * in the SVR4 ELF ABI.
+ */
+#define R_PPC_EMB_NADDR32      101
+#define R_PPC_EMB_NADDR16      102
+#define R_PPC_EMB_NADDR16_LO   103
+#define R_PPC_EMB_NADDR16_HI   104
+#define R_PPC_EMB_NADDR16_HA   105
+#define R_PPC_EMB_SDAI16       106
+#define R_PPC_EMB_SDA2I16      107
+#define R_PPC_EMB_SDA2REL      108
+#define R_PPC_EMB_SDA21                109     /* 16 bit offset in SDA */
+#define R_PPC_EMB_MRKREF       110
+#define R_PPC_EMB_RELSEC16     111
+#define R_PPC_EMB_RELST_LO     112
+#define R_PPC_EMB_RELST_HI     113
+#define R_PPC_EMB_RELST_HA     114
+#define R_PPC_EMB_BIT_FLD      115
+#define R_PPC_EMB_RELSDA       116     /* 16 bit relative offset in SDA */
+
+/* Diab tool relocations */
+#define R_PPC_DIAB_SDA21_LO    180     /* like EMB_SDA21, but lower 16 bit */
+#define R_PPC_DIAB_SDA21_HI    181     /* like EMB_SDA21, but high 16 bit */
+#define R_PPC_DIAB_SDA21_HA    182     /* like EMB_SDA21, adjusted high 16 */
+#define R_PPC_DIAB_RELSDA_LO   183     /* like EMB_RELSDA, but lower 16 bit */
+#define R_PPC_DIAB_RELSDA_HI   184     /* like EMB_RELSDA, but high 16 bit */
+#define R_PPC_DIAB_RELSDA_HA   185     /* like EMB_RELSDA, adjusted high 16 */
+
+/*
+ * This is a phony reloc to handle any old fashioned TOC16 references
+ * that may still be in object files.
+ */
+#define R_PPC_TOC16            255
+
+ /* ARM relocs */
+#define R_ARM_NONE             0       /* No reloc */
+#define R_ARM_RELATIVE         23      /* Adjust by program base */
+
+/* AArch64 relocs */
+#define R_AARCH64_NONE         0       /* No relocation */
+#define R_AARCH64_RELATIVE     1027    /* Adjust by program base */
+
+/* RISC-V relocations */
+#define R_RISCV_32             1
+#define R_RISCV_64             2
+#define R_RISCV_RELATIVE       3
+
+#ifndef __ASSEMBLY__
+int valid_elf_image(unsigned long addr);
+unsigned long load_elf64_image_phdr(unsigned long addr);
+unsigned long load_elf64_image_shdr(unsigned long addr);
+unsigned long load_elf_image_phdr(unsigned long addr);
+unsigned long load_elf_image_shdr(unsigned long addr);
+#endif
 
 #endif /* _ELF_H */