kernel: support elf32 on x86_64.

* define ELF32_COMPAT to enable ELF32 macros.
* add a flag ELF_LOAD_USER_IMAGE_TEST_EXECUTABLE to only check the format.
It will be used by load_image_internal() to check which mode to use when
loading an image.
* in arch_elf_relocate_rel(), switch to elf_addr instead of addr_t, which
would be the wrong size for elf32 on x86_64.
* the ELF compat loader reuses the relevant parts of elf.cpp and arch_elf.cpp,
excluding for instance load_kernel_add_on() or dump functions.

Change-Id: Ifa47334e5adefd45405a823a3accbd12eee5b116
This commit is contained in:
Jérôme Duval
2018-05-15 10:29:00 +00:00
parent 496080235a
commit a553e95d85
8 changed files with 111 additions and 27 deletions
@@ -47,7 +47,7 @@
#define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base. */
#ifdef _BOOT_MODE
#if defined(_BOOT_MODE) || defined(ELF32_COMPAT)
# include "../x86/arch_elf.h"
#endif
+4 -3
View File
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 Haiku, Inc. All rights reserved.
* Copyright 2002-2018 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Copyright 2001 Travis Geiselbrecht. All rights reserved.
@@ -18,7 +18,7 @@
// Determine the correct ELF types to use for the architecture
#if B_HAIKU_64_BIT
#if defined(B_HAIKU_64_BIT) && !defined(ELF32_COMPAT)
# define _ELF_TYPE(type) Elf64_##type
#else
# define _ELF_TYPE(type) Elf32_##type
@@ -26,6 +26,7 @@
#define DEFINE_ELF_TYPE(type, name) \
typedef _ELF_TYPE(type) name
DEFINE_ELF_TYPE(Addr, elf_addr);
DEFINE_ELF_TYPE(Ehdr, elf_ehdr);
DEFINE_ELF_TYPE(Phdr, elf_phdr);
DEFINE_ELF_TYPE(Shdr, elf_shdr);
@@ -48,7 +49,7 @@ DEFINE_ELF_TYPE(Note_Thread_Entry, elf_note_thread_entry);
typedef uint16 elf_versym;
#if B_HAIKU_64_BIT
#if defined(B_HAIKU_64_BIT) && !defined(ELF32_COMPAT)
# define ELF_CLASS ELFCLASS64
#else
# define ELF_CLASS ELFCLASS32