Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/aarch64/target_elf.h | 1 +
linux-user/loader.h | 5 +++++
linux-user/aarch64/elfload.c | 18 +++++++++++++++++
linux-user/elfload.c | 35 ++++++---------------------------
4 files changed, 30 insertions(+), 29 deletions(-)
diff --git a/linux-user/aarch64/target_elf.h b/linux-user/aarch64/target_elf.h
index 16acf6d47f..2d396ad11a 100644
--- a/linux-user/aarch64/target_elf.h
+++ b/linux-user/aarch64/target_elf.h
@@ -11,6 +11,7 @@
#define ELF_MACHINE EM_AARCH64
#define ELF_CLASS ELFCLASS64
#define USE_ELF_CORE_DUMP
+#define ARCH_USE_GNU_PROPERTY 1
#if TARGET_BIG_ENDIAN
# define VDSO_HEADER "vdso-be.c.inc"
diff --git a/linux-user/loader.h b/linux-user/loader.h
index a4178ce2c1..95cbeed5d4 100644
--- a/linux-user/loader.h
+++ b/linux-user/loader.h
@@ -117,4 +117,9 @@ typedef struct {
/* Note that both Elf32_Word and Elf64_Word are uint32_t. */
const VdsoImageInfo *get_vdso_image_info(uint32_t elf_flags);
+bool arch_parse_elf_property(uint32_t pr_type, uint32_t pr_datasz,
+ const uint32_t *data,
+ struct image_info *info,
+ Error **errp);
+
#endif /* LINUX_USER_LOADER_H */
diff --git a/linux-user/aarch64/elfload.c b/linux-user/aarch64/elfload.c
index 1030cb8094..d186b4685c 100644
--- a/linux-user/aarch64/elfload.c
+++ b/linux-user/aarch64/elfload.c
@@ -1,9 +1,11 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include "qemu/osdep.h"
+#include "qapi/error.h"
#include "qemu.h"
#include "loader.h"
#include "target/arm/cpu-features.h"
+#include "elf.h"
const char *get_elf_cpu_model(uint32_t eflags)
@@ -347,3 +349,19 @@ const char *get_elf_platform(CPUState *cs)
{
return TARGET_BIG_ENDIAN ? "aarch64_be" : "aarch64";
}
+
+bool arch_parse_elf_property(uint32_t pr_type, uint32_t pr_datasz,
+ const uint32_t *data,
+ struct image_info *info,
+ Error **errp)
+{
+ if (pr_type == GNU_PROPERTY_AARCH64_FEATURE_1_AND) {
+ if (pr_datasz != sizeof(uint32_t)) {
+ error_setg(errp, "Ill-formed GNU_PROPERTY_AARCH64_FEATURE_1_AND");
+ return false;
+ }
+ /* We will extract GNU_PROPERTY_AARCH64_FEATURE_1_BTI later. */
+ info->note_flags = *data;
+ }
+ return true;
+}
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 14d4502b3c..54ea9221d9 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -184,41 +184,18 @@ const char * __attribute__((weak)) get_elf_base_platform(CPUState *cs)
return NULL;
}
-#include "elf.h"
-
-/* We must delay the following stanzas until after "elf.h". */
-#if defined(TARGET_AARCH64)
-
-static bool arch_parse_elf_property(uint32_t pr_type, uint32_t pr_datasz,
- const uint32_t *data,
- struct image_info *info,
- Error **errp)
-{
- if (pr_type == GNU_PROPERTY_AARCH64_FEATURE_1_AND) {
- if (pr_datasz != sizeof(uint32_t)) {
- error_setg(errp, "Ill-formed GNU_PROPERTY_AARCH64_FEATURE_1_AND");
- return false;
- }
- /* We will extract GNU_PROPERTY_AARCH64_FEATURE_1_BTI later. */
- info->note_flags = *data;
- }
- return true;
-}
-#define ARCH_USE_GNU_PROPERTY 1
-
-#else
-
-static bool arch_parse_elf_property(uint32_t pr_type, uint32_t pr_datasz,
- const uint32_t *data,
- struct image_info *info,
- Error **errp)
+#ifndef ARCH_USE_GNU_PROPERTY
+bool arch_parse_elf_property(uint32_t pr_type, uint32_t pr_datasz,
+ const uint32_t *data, struct image_info *info,
+ Error **errp)
{
g_assert_not_reached();
}
#define ARCH_USE_GNU_PROPERTY 0
-
#endif
+#include "elf.h"
+
struct exec
{
unsigned int a_info; /* Use macros N_MAGIC, etc for access */
--
2.43.0