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:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2005, Haiku Inc. All Rights Reserved.
|
||||
* Copyright 2005-2018 Haiku Inc. All Rights Reserved.
|
||||
* Distributed under the terms of the MIT license.
|
||||
*
|
||||
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
||||
@@ -27,8 +27,13 @@ struct elf_symbol_info {
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
status_t elf_load_user_image(const char *path, Team *team, int flags,
|
||||
status_t elf_load_user_image(const char *path, Team *team, uint32 flags,
|
||||
addr_t *_entry);
|
||||
#ifdef _COMPAT_MODE
|
||||
#define ELF_LOAD_USER_IMAGE_TEST_EXECUTABLE 0x1
|
||||
status_t elf32_load_user_image(const char *path, Team *team, uint32 flags,
|
||||
addr_t *_entry);
|
||||
#endif
|
||||
|
||||
// these two might get public one day:
|
||||
image_id load_kernel_add_on(const char *path);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2007, Haiku Inc. All Rights Reserved.
|
||||
* Copyright 2002-2018, Haiku Inc. All Rights Reserved.
|
||||
* Distributed under the terms of the MIT license.
|
||||
*
|
||||
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
||||
@@ -81,7 +81,7 @@ extern "C" {
|
||||
|
||||
extern status_t elf_resolve_symbol(struct elf_image_info* image,
|
||||
elf_sym* symbol, struct elf_image_info* sharedImage,
|
||||
addr_t* _symbolAddress);
|
||||
elf_addr* _symbolAddress);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user