Changeset 227


Ignore:
Timestamp:
Jul 18, 2017, 12:32:31 PM (4 years ago)
Author:
max@…
Message:

use Elf64 for 64bit architectures (x86_64)

Location:
trunk/kernel/libk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/kernel/libk/elf.c

    r204 r227  
    3838// - return false with an error message if illegal header.
    3939///////////////////////////////////////////////////////////////////
    40 static bool_t elf_isValidHeader(Elf32_Ehdr *header)
     40static bool_t elf_isValidHeader(Elf_Ehdr *header)
    4141{
    4242        if((header->e_ident[EI_CLASS] == ELFCLASS32)
     
    9898        }
    9999
    100         Elf32_Ehdr * header = (Elf32_Ehdr *)buffer;
     100        Elf_Ehdr * header = (Elf_Ehdr *)buffer;
    101101
    102102        if( (header->e_ident[EI_MAG0] != ELFMAG0) ||
     
    141141        vseg_t     * vseg;
    142142
    143         Elf32_Phdr * seg_ptr = (Elf32_Phdr *)segs_base;
     143        Elf_Phdr * seg_ptr = (Elf_Phdr *)segs_base;
    144144
    145145        // loop on segments
     
    223223{
    224224        kmem_req_t   req;              // kmem request for program header
    225         Elf32_Ehdr   header;           // local buffer for .elf header
     225        Elf_Ehdr     header;           // local buffer for .elf header
    226226        void       * segs_base;        // pointer on buffer for segment descriptors array
    227227        uint32_t     segs_size;        // size of buffer for segment descriptors array
     
    255255        error = elf_header_load( file_xp ,
    256256                                 &header,
    257                                  sizeof(Elf32_Ehdr) );
     257                                 sizeof(Elf_Ehdr) );
    258258        if( error )
    259259        {
     
    273273
    274274        // compute buffer size for segment descriptors array
    275         segs_size = sizeof(Elf32_Phdr) * header.e_phnum;
     275        segs_size = sizeof(Elf_Phdr) * header.e_phnum;
    276276
    277277        // allocate memory for segment descriptors array
  • trunk/kernel/libk/elf.h

    r204 r227  
    2828 */
    2929
    30 /* Type for a 16-bit quantity. */
     30#define EI_NIDENT (16)
     31
     32/* 32bit version */
    3133typedef uint16_t Elf32_Half;
    32 
    33 /* Types for signed and unsigned 32-bit quantities. */
    3434typedef uint32_t Elf32_Word;
    35 typedef int32_t  Elf32_Sword;
    36 
    37 /* Type of addresses. */
     35typedef int32_t  Elf32_Sword;
    3836typedef uint32_t Elf32_Addr;
    39 
    40 /* Type of file offsets. */
    4137typedef uint32_t Elf32_Off;
    4238
    43 /* Type for section indices, which are 16-bit quantities. */
    44 typedef uint16_t Elf32_Section;
    45 
    46 /* Type for version symbol information. */
    47 typedef Elf32_Half Elf32_Versym;
    48 
    49 /*************************************************************************************
    50  * This structure defines the ELF file header (first bytes in the file)
    51  *************************************************************************************/
    52 
    53 #define EI_NIDENT (16)
    54 
    55 typedef struct
    56 {
    57         unsigned char   e_ident[EI_NIDENT];     /* Magic number and other info */
     39/* 64bit version */
     40typedef uint16_t Elf64_Half;
     41typedef uint32_t Elf64_Word;
     42typedef int32_t  Elf64_Sword;
     43typedef uint64_t Elf64_Addr;
     44typedef uint64_t Elf64_Off;
     45
     46/* ELF header - 32bit version. */
     47typedef struct
     48{
     49        unsigned char   e_ident[EI_NIDENT]; /* Magic number and other info */
    5850        Elf32_Half      e_type;             /* Object file type */
    5951        Elf32_Half      e_machine;          /* Architecture */
    6052        Elf32_Word      e_version;          /* Object file version */
    61         Elf32_Addr          e_entry;            /* Entry point virtual address */
    62         Elf32_Off           e_phoff;            /* Program header table file offset */
    63         Elf32_Off           e_shoff;            /* Section header table file offset */
     53        Elf32_Addr      e_entry;            /* Entry point virtual address */
     54        Elf32_Off       e_phoff;            /* Program header table file offset */
     55        Elf32_Off       e_shoff;            /* Section header table file offset */
    6456        Elf32_Word      e_flags;            /* Processor-specific flags */
    6557        Elf32_Half      e_ehsize;           /* ELF header size in bytes */
     
    7163}
    7264Elf32_Ehdr;
     65
     66/* ELF header - 64bit version. */
     67typedef struct
     68{
     69        unsigned char   e_ident[EI_NIDENT]; /* Magic number and other info */
     70        Elf64_Half      e_type;             /* Object file type */
     71        Elf64_Half      e_machine;          /* Architecture */
     72        Elf64_Word      e_version;          /* Object file version */
     73        Elf64_Addr      e_entry;            /* Entry point virtual address */
     74        Elf64_Off       e_phoff;            /* Program header table file offset */
     75        Elf64_Off       e_shoff;            /* Section header table file offset */
     76        Elf64_Word      e_flags;            /* Processor-specific flags */
     77        Elf64_Half      e_ehsize;           /* ELF header size in bytes */
     78        Elf64_Half      e_phentsize;        /* Program header table entry size */
     79        Elf64_Half      e_phnum;            /* Program header table entry count */
     80        Elf64_Half      e_shentsize;        /* Section header table entry size */
     81        Elf64_Half      e_shnum;            /* Section header table entry count */
     82        Elf64_Half      e_shstrndx;             /* Section header string table index */
     83}
     84Elf64_Ehdr;
    7385
    7486/*
     
    132144#define EV_NUM          2
    133145
    134 /* Program segment header.  */
    135 
    136 typedef struct
    137 {
    138         Elf32_Word      p_type;         /* Segment type */
    139         Elf32_Off       p_offset;       /* Segment file offset */
    140         Elf32_Addr      p_vaddr;        /* Segment virtual address */
    141         Elf32_Addr      p_paddr;        /* Segment physical address */
    142         Elf32_Word      p_filesz;       /* Segment size in file */
    143         Elf32_Word      p_memsz;        /* Segment size in memory */
    144         Elf32_Word      p_flags;        /* Segment flags */
    145         Elf32_Word      p_align;    /* Segment alignment */
     146/* Program segment header - 32bit version. */
     147typedef struct
     148{
     149        Elf32_Word  p_type;     /* Segment type */
     150        Elf32_Off   p_offset;   /* Segment file offset */
     151        Elf32_Addr  p_vaddr;    /* Segment virtual address */
     152        Elf32_Addr  p_paddr;    /* Segment physical address */
     153        Elf32_Word  p_filesz;   /* Segment size in file */
     154        Elf32_Word  p_memsz;    /* Segment size in memory */
     155        Elf32_Word  p_flags;    /* Segment flags */
     156        Elf32_Word  p_align;    /* Segment alignment */
    146157}
    147158Elf32_Phdr;
     159
     160/* Program segment header - 64bit version. */
     161typedef struct
     162{
     163        Elf64_Word  p_type;     /* Segment type */
     164        Elf64_Word  p_flags;    /* Segment flags */
     165        Elf64_Off   p_offset;   /* Segment file offset */
     166        Elf64_Addr  p_vaddr;    /* Segment virtual address */
     167        Elf64_Addr  p_paddr;    /* Segment physical address */
     168        Elf64_Word  p_filesz;   /* Segment size in file */
     169        Elf64_Word  p_memsz;    /* Segment size in memory */
     170        Elf64_Word  p_align;    /* Segment alignment */
     171}
     172Elf64_Phdr;
    148173
    149174/* Legal values for p_type (segment type).  */
     
    176201#define PF_MASKPROC     0xf0000000      /* Processor-specific */
    177202
     203#if defined(HAL_32BIT)
     204#define Elf_Half  Elf32_Half
     205#define Elf_Word  Elf32_Word
     206#define Elf_Sword Elf32_Sword
     207#define Elf_Addr  Elf32_Addr
     208#define Elf_Off   Elf32_Off
     209#define Elf_Ehdr  Elf32_Ehdr
     210#define Elf_Phdr  Elf32_Phdr
     211#elif defined (HAL_64BIT)
     212#define Elf_Half  Elf64_Half
     213#define Elf_Word  Elf64_Word
     214#define Elf_Sword Elf64_Sword
     215#define Elf_Addr  Elf64_Addr
     216#define Elf_Off   Elf64_Off
     217#define Elf_Ehdr  Elf64_Ehdr
     218#define Elf_Phdr  Elf64_Phdr
     219#else
     220#error "Must define HAL_64BIT/HAL_32BIT"
     221#endif
    178222
    179223/****************************************************************************************
Note: See TracChangeset for help on using the changeset viewer.