# elf.h

Go to the documentation of this file.

    00001 /*****************************************************************************************
    00002  Copyright (c) 2002-2004 The UbixOS Project
    00003  All rights reserved.
    00004
    00005  Redistribution and use in source and binary forms, with or without modification, are
    00006  permitted provided that the following conditions are met:
    00007
    00008  Redistributions of source code must retain the above copyright notice, this list of
    00009  conditions, the following disclaimer and the list of authors.  Redistributions in binary
    00010  form must reproduce the above copyright notice, this list of conditions, the following
    00011  disclaimer and the list of authors in the documentation and/or other materials provided
    00012  with the distribution. Neither the name of the UbixOS Project nor the names of its
    00013  contributors may be used to endorse or promote products derived from this software
    00014  without specific prior written permission.
    00015
    00016  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
    00017  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    00018  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
    00019  THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    00020  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
    00021  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    00022  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
    00023  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    00024  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    00025
    00026  $Id: elf_8h-source.html 88 2016-01-12 00:11:29Z reddawg $
    00027
    00028 *****************************************************************************************/
    00029
    00030 #ifndef _ELF_H
    00031 #define _ELF_H
    00032
    00033 #include <ubixos/types.h>
    00034 #include <ubixos/sched.h>
    00035
    00036 #define elfExecutable 0x002
    00037 #define elfLibrary    0x003
    00038
    00039 #define R_386_NONE      0 /* none    none        */
    00040 #define R_386_32        1 /* word32  S + A       */
    00041 #define R_386_PC32      2 /* word32  S + A - P   */
    00042 #define R_386_GOT32     3 /* word32  G + A - P   */
    00043 #define R_386_PLT32     4 /* word32  L + A - P   */
    00044 #define R_386_COPY      5 /* none    none        */
    00045 #define R_386_GLOB_DAT  6 /* word32  S           */
    00046 #define R_386_JMP_SLOT  7 /* word32  S           */
    00047 #define R_386_RELATIVE  8 /* word32  B + A       */
    00048 #define R_386_GOTOFF    9 /* word32  S + A - GOT */
    00049 #define R_386_GOTPC    10 /* word32  GOT + A - P */
    00050
    00051
    00052 /* Elf Types */
    00053 #define ET_NONE         0  // No file type
    00054 #define ET_REL          1  // Relocatable file
    00055 #define ET_EXEC         2  // Executable file
    00056 #define ET_DYN          3  // Shared object file
    00057 #define ET_CORE         4  // Core file
    00058 #define ET_LOPROC  0xff00  // Processor-specific
    00059 #define ET_HIPROC  0xffff
    00060 /* End Elf Types */
    00061
    00062 /* Elf Machine Types */
    00063 #define EM_NONE       0  // No machine
    00064 #define EM_M32        1  // AT&T WE 32100
    00065 #define EM_SPARC      2  // SPARC
    00066 #define EM_386        3  // Intel 80386
    00067 #define EM_68K        4  // Motorola 68000
    00068 #define EM_88K        5  // Motorola 88000
    00069 #define EM_860        7  // Intel 80860
    00070 #define EM_MIPS       8  // MIPS RS3000
    00071 /* End Elf Machines Types */
    00072
    00073 /* Elf Version */
    00074 #define EV_NONE          0  // Invalid version
    00075 #define EV_CURRENT       1  // Current version
    00076 /* End Elf Version */
    00077
    00078 /* Elf Program Header Types */
    00079 #define PT_NULL          0
    00080 #define PT_LOAD          1
    00081 #define PT_DYNAMIC       2
    00082 #define PT_INTERP        3
    00083 #define PT_NOTE          4
    00084 #define PT_SHLIB         5
    00085 #define PT_PHDR          6
    00086 #define PT_LOOS          0x60000000
    00087 #define PT_HIOS          0x6fffffff
    00088 #define PT_LOPROC        0x70000000
    00089 #define PT_HIPROC        0x7fffffff
    00090 #define PT_GNU_EH_FRAME  0x6474e550
    00091 #define PT_GNU_STACK     (PT_LOOS + 0x474e551)
    00092 #define PT_GNU_RELRO     (PT_LOOS + 0x474e552)
    00093 #define PT_PAX_FLAGS     (PT_LOOS + 0x5041580)
    00094
    00095 /* End Elf Program Header Types */
    00096
    00097 typedef struct {
    00098   uInt8  eIdent[16]; /* File identification. */
    00099   uInt16 eType;      /* File type. */
    00100   uInt16 eMachine;   /* Machine architecture. */
    00101   uInt32  eVersion;   /* ELF format version. */
    00102   uInt32  eEntry;     /* Entry point. */
    00103   uInt32  ePhoff;     /* Program header file offset. */
    00104   uInt32  eShoff;     /* Section header file offset. */
    00105   uInt32  eFlags;     /* Architecture-specific flags. */
    00106   uInt16 eEhsize;    /* Size of ELF header in bytes. */
    00107   uInt16 ePhentsize; /* Size of program header entry. */
    00108   uInt16 ePhnum;     /* Number of program header entries. */
    00109   uInt16 eShentsize; /* Size of section header entry. */
    00110   uInt16 eShnum;     /* Number of section header entries. */
    00111   uInt16 eShstrndx;  /* Section name strings section. */
    00112   } elfHeader;
    00113
    00114 typedef struct {
    00115   uInt32 phType;         /* Entry type. */
    00116   uInt32 phOffset;       /* File offset of contents. */
    00117   uInt32 phVaddr;        /* Virtual address in memory image. */
    00118   uInt32 phPaddr;        /* Physical address (not used). */
    00119   uInt32 phFilesz;       /* Size of contents in file. */
    00120   uInt32 phMemsz;        /* Size of contents in memory. */
    00121   uInt32 phFlags;        /* Access permission flags. */
    00122   uInt32 phAlign;        /* Alignment in memory and file. */
    00123   } elfProgramHeader;
    00124
    00125 typedef struct {
    00126   uInt32 shName;        /* Section name (index into the section header string table). */
    00127   uInt32 shType;        /* Section type. */
    00128   uInt32 shFlags;       /* Section flags. */
    00129   uInt32 shAddr;        /* Address in memory image. */
    00130   uInt32 shOffset;      /* Offset in file. */
    00131   uInt32 shSize;        /* Size in bytes. */
    00132   uInt32 shLink;        /* Index of a related section. */
    00133   uInt32 shInfo;        /* Depends on section type. */
    00134   uInt32 shAddralign;   /* Alignment in bytes. */
    00135   uInt32 shEntsize;     /* Size of each entry in section. */
    00136   } elfSectionHeader;
    00137
    00138 typedef struct {
    00139   uInt32 pltOffset;
    00140   uInt32 pltInfo;
    00141   } elfPltInfo;
    00142
    00143 typedef struct {
    00144   uInt32 dynName;
    00145   uInt32 dynValue;
    00146   uInt32 dynSize;
    00147   uInt32 dynInfo;
    00148   } elfDynSym;
    00149
    00150 typedef struct {
    00151   uInt32 dynVal;
    00152   uInt32 dynPtr;
    00153   } elfDynamic;
    00154
    00155 typedef struct {
    00156         int32_t          execfd;
    00157         u_int32_t        phdr;
    00158         u_int32_t        phent;
    00159         u_int32_t        phnum;
    00160         u_int32_t        pagesz;
    00161         u_int32_t        base;
    00162         u_int32_t        flags;
    00163         u_int32_t        entry;
    00164         u_int32_t        trace;
    00165 } Elf_Auxargs;
    00166
    00167 char *elfGetShType(int);
    00168 char *elfGetPhType(int);
    00169 char *elfGetRelType(int);
    00170 int elf_loadfile(kTask_t *p,const char *file,u_int32_t *addr,u_int32_t *entry);
    00171
    00172 #define ELF32_R_SYM(i)      ((i)>>8)
    00173 #define ELF32_R_TYPE(i)     ((unsigned char)(i))
    00174 #define ELF32_R_INFO(s, t)  ((s)<<8+(unsigned char)(t))
    00175
    00176 #endif
    00177
    00178 /***
    00179  $Log: elf_8h-source.html,v $
    00179  Revision 1.7  2006/12/15 17:47:05  reddawg
    00179  Updates
    00179
    00180  Revision 1.2  2006/12/15 15:43:46  reddawg
    00181  Changes
    00182
    00183  Revision 1.1.1.1  2006/06/01 12:46:13  reddawg
    00184  ubix2
    00185
    00186  Revision 1.2  2005/10/12 00:13:37  reddawg
    00187  Removed
    00188
    00189  Revision 1.1.1.1  2005/09/26 17:23:54  reddawg
    00190  no message
    00191
    00192  Revision 1.7  2004/09/11 01:20:08  apwillia
    00193  Clean up 'Unhandled Header' printfs when compiled in linux
    00194
    00195  Revision 1.6  2004/06/16 14:04:51  reddawg
    00196  Renamed a typedef
    00197
    00198  Revision 1.5  2004/06/14 12:20:54  reddawg
    00199  notes: many bugs repaired and ld works 100% now.
    00200
    00201  Revision 1.4  2004/06/12 01:27:26  reddawg
    00202  shared objects: yes we almost fully support shared objects
    00203
    00204  Revision 1.3  2004/05/21 15:20:00  reddawg
    00205  Cleaned up
    00206
    00207
    00208  END
    00209  ***/