bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 2/4] x86_64: load Elf64 bootstrap modules if ! USER32


From: Samuel Thibault
Subject: Re: [PATCH 2/4] x86_64: load Elf64 bootstrap modules if ! USER32
Date: Thu, 16 Feb 2023 23:27:33 +0100
User-agent: NeoMutt/20170609 (1.8.3)

Applied, thanks!

Luca Dariz, le jeu. 16 févr. 2023 22:33:16 +0100, a ecrit:
> * i386/include/mach/i386/exec/elf.h: add Elf64 definitions and define
>   common Elf structures, corresponding to 32/64 bit variants at
>   compile time.
> * include/mach/exec/elf.h: add Elf64 definitions
> * kern/elf-load.c: use common Elf structures
> ---
>  i386/include/mach/i386/exec/elf.h | 20 ++++++++++++++++-
>  include/mach/exec/elf.h           | 36 +++++++++++++++++++++++++++++++
>  kern/elf-load.c                   | 10 ++++-----
>  3 files changed, 60 insertions(+), 6 deletions(-)
> 
> diff --git a/i386/include/mach/i386/exec/elf.h 
> b/i386/include/mach/i386/exec/elf.h
> index cfa988d2..582f8767 100644
> --- a/i386/include/mach/i386/exec/elf.h
> +++ b/i386/include/mach/i386/exec/elf.h
> @@ -29,8 +29,26 @@ typedef unsigned int       Elf32_Off;
>  typedef signed int   Elf32_Sword;
>  typedef unsigned int Elf32_Word;
>  
> -/* Architecture identification parameters for i386.  */
> +typedef uint64_t     Elf64_Addr;
> +typedef uint64_t     Elf64_Off;
> +typedef int32_t              Elf64_Shalf;
> +typedef int32_t              Elf64_Sword;
> +typedef uint32_t     Elf64_Word;
> +typedef int64_t              Elf64_Sxword;
> +typedef uint64_t     Elf64_Xword;
> +typedef uint32_t     Elf64_Half;
> +typedef uint16_t     Elf64_Quarter;
> +
> +
> +/* Architecture identification parameters for x86.  */
> +#if defined(__x86_64__) && ! defined(USER32)
> +#define MY_ELF_CLASS ELFCLASS64
> +#define MY_EI_DATA   ELFDATA2LSB
> +#define MY_E_MACHINE EM_X86_64
> +#else
> +#define MY_ELF_CLASS ELFCLASS32
>  #define MY_EI_DATA   ELFDATA2LSB
>  #define MY_E_MACHINE EM_386
> +#endif
>  
>  #endif /* _MACH_I386_EXEC_ELF_H_ */
> diff --git a/include/mach/exec/elf.h b/include/mach/exec/elf.h
> index 81989309..3b545104 100644
> --- a/include/mach/exec/elf.h
> +++ b/include/mach/exec/elf.h
> @@ -48,6 +48,22 @@ typedef struct {
>    Elf32_Half         e_shstrndx;
>  } Elf32_Ehdr;
>  
> +typedef struct {
> +  unsigned char      e_ident[EI_NIDENT];     /* Id bytes */
> +  Elf64_Quarter      e_type;                 /* file type */
> +  Elf64_Quarter      e_machine;              /* machine type */
> +  Elf64_Half e_version;              /* version number */
> +  Elf64_Addr e_entry;                /* entry point */
> +  Elf64_Off  e_phoff;                /* Program hdr offset */
> +  Elf64_Off  e_shoff;                /* Section hdr offset */
> +  Elf64_Half e_flags;                /* Processor flags */
> +  Elf64_Quarter      e_ehsize;               /* sizeof ehdr */
> +  Elf64_Quarter      e_phentsize;            /* Program header entry size */
> +  Elf64_Quarter      e_phnum;                /* Number of program headers */
> +  Elf64_Quarter      e_shentsize;            /* Section header entry size */
> +  Elf64_Quarter      e_shnum;                /* Number of section headers */
> +  Elf64_Quarter      e_shstrndx;             /* String table index */
> +} Elf64_Ehdr;
>  
>  /* e_ident[] identification indexes - figure 4-4, page 4-7 */
>    
> @@ -104,6 +120,7 @@ typedef struct {
>  #define EM_SPARC64   11
>  #define EM_PARISC    15
>  #define EM_PPC               20
> +#define EM_X86_64    62
>  
>  /* version - page 4-6 */
>  
> @@ -233,6 +250,17 @@ typedef struct {
>    Elf32_Word         p_align;
>  } Elf32_Phdr;
>  
> +typedef struct {
> +  Elf64_Half p_type;         /* entry type */
> +  Elf64_Half p_flags;        /* flags */
> +  Elf64_Off  p_offset;       /* offset */
> +  Elf64_Addr p_vaddr;        /* virtual address */
> +  Elf64_Addr p_paddr;        /* physical address */
> +  Elf64_Xword        p_filesz;       /* file size */
> +  Elf64_Xword        p_memsz;        /* memory size */
> +  Elf64_Xword        p_align;        /* memory & file alignment */
> +} Elf64_Phdr;
> +
>  /* segment types - page 5-3, figure 5-2 */
>  
>  #define PT_NULL              0
> @@ -291,6 +319,14 @@ typedef struct {
>  #define DT_TEXTREL   22
>  #define DT_JMPREL    23
>  
> +#if defined(__x86_64__) && ! defined(USER32)
> +typedef Elf64_Ehdr Elf_Ehdr;
> +typedef Elf64_Phdr Elf_Phdr;
> +#else
> +typedef Elf32_Ehdr Elf_Ehdr;
> +typedef Elf32_Phdr Elf_Phdr;
> +#endif
> +
>  /*
>   *   Bootstrap doesn't need machine dependent extensions.
>   */
> diff --git a/kern/elf-load.c b/kern/elf-load.c
> index 3e80edfe..ce86327c 100644
> --- a/kern/elf-load.c
> +++ b/kern/elf-load.c
> @@ -31,8 +31,8 @@ int exec_load(exec_read_func_t *read, exec_read_exec_func_t 
> *read_exec,
>                 void *handle, exec_info_t *out_info)
>  {
>       vm_size_t actual;
> -     Elf32_Ehdr x;
> -     Elf32_Phdr *phdr, *ph;
> +     Elf_Ehdr x;
> +     Elf_Phdr *phdr, *ph;
>       vm_size_t phsize;
>       int i;
>       int result;
> @@ -51,7 +51,7 @@ int exec_load(exec_read_func_t *read, exec_read_exec_func_t 
> *read_exec,
>               return EX_NOT_EXECUTABLE;
>  
>       /* Make sure the file is of the right architecture.  */
> -     if ((x.e_ident[EI_CLASS] != ELFCLASS32) ||
> +     if ((x.e_ident[EI_CLASS] != MY_ELF_CLASS) ||
>           (x.e_ident[EI_DATA] != MY_EI_DATA) ||
>           (x.e_machine != MY_E_MACHINE))
>               return EX_WRONG_ARCH;
> @@ -65,7 +65,7 @@ int exec_load(exec_read_func_t *read, exec_read_exec_func_t 
> *read_exec,
>       out_info->entry = (vm_offset_t) x.e_entry + loadbase;
>  
>       phsize = x.e_phnum * x.e_phentsize;
> -     phdr = (Elf32_Phdr *)alloca(phsize);
> +     phdr = (Elf_Phdr *)alloca(phsize);
>  
>       result = (*read)(handle, x.e_phoff, phdr, phsize, &actual);
>       if (result)
> @@ -75,7 +75,7 @@ int exec_load(exec_read_func_t *read, exec_read_exec_func_t 
> *read_exec,
>  
>       for (i = 0; i < x.e_phnum; i++)
>       {
> -             ph = (Elf32_Phdr *)((vm_offset_t)phdr + i * x.e_phentsize);
> +             ph = (Elf_Phdr *)((vm_offset_t)phdr + i * x.e_phentsize);
>               if (ph->p_type == PT_LOAD)
>               {
>                       exec_sectype_t type = EXEC_SECTYPE_ALLOC |
> -- 
> 2.30.2
> 
> 

-- 
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]