Rename from vdso_image_info to avoid a symbol clash.
Provide fallback versions for other targets.

Signed-off-by: Richard Henderson <richard.hender...@linaro.org>
---
 linux-user/loader.h      | 12 ++++++++++++
 linux-user/arm/elfload.c | 20 ++++++++++++++++++++
 linux-user/elfload.c     | 41 ++++++++++------------------------------
 3 files changed, 42 insertions(+), 31 deletions(-)

diff --git a/linux-user/loader.h b/linux-user/loader.h
index e6d02d186e..db6547ea7a 100644
--- a/linux-user/loader.h
+++ b/linux-user/loader.h
@@ -104,4 +104,16 @@ const char *get_elf_platform(CPUState *cs);
 const char *get_elf_base_platform(CPUState *cs);
 bool init_guest_commpage(void);
 
+typedef struct {
+    const uint8_t *image;
+    const uint32_t *relocs;
+    unsigned image_size;
+    unsigned reloc_count;
+    unsigned sigreturn_ofs;
+    unsigned rt_sigreturn_ofs;
+} VdsoImageInfo;
+
+/* Note that both Elf32_Word and Elf64_Word are uint32_t. */
+const VdsoImageInfo *get_vdso_image_info(uint32_t elf_flags);
+
 #endif /* LINUX_USER_LOADER_H */
diff --git a/linux-user/arm/elfload.c b/linux-user/arm/elfload.c
index ad0d88a7e0..901141ad2a 100644
--- a/linux-user/arm/elfload.c
+++ b/linux-user/arm/elfload.c
@@ -6,6 +6,7 @@
 #include "user-internals.h"
 #include "target_elf.h"
 #include "target/arm/cpu-features.h"
+#include "elf.h"
 
 
 enum
@@ -240,3 +241,22 @@ bool init_guest_commpage(void)
                    PAGE_READ | PAGE_EXEC | PAGE_VALID);
     return true;
 }
+
+#if TARGET_BIG_ENDIAN
+# include "vdso-be8.c.inc"
+# include "vdso-be32.c.inc"
+#else
+# include "vdso-le.c.inc"
+#endif
+
+const VdsoImageInfo *get_vdso_image_info(uint32_t elf_flags)
+{
+#if TARGET_BIG_ENDIAN
+    return (EF_ARM_EABI_VERSION(elf_flags) >= EF_ARM_EABI_VER4
+            && (elf_flags & EF_ARM_BE8)
+            ? &vdso_be8_image_info
+            : &vdso_be32_image_info);
+#else
+    return &vdso_image_info;
+#endif
+}
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 01c39bf456..10fbe71e35 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -46,15 +46,6 @@
 #define TARGET_ARCH_HAS_SIGTRAMP_PAGE 0
 #endif
 
-typedef struct {
-    const uint8_t *image;
-    const uint32_t *relocs;
-    unsigned image_size;
-    unsigned reloc_count;
-    unsigned sigreturn_ofs;
-    unsigned rt_sigreturn_ofs;
-} VdsoImageInfo;
-
 #define ELF_OSABI   ELFOSABI_SYSV
 
 /* from personality.h */
@@ -206,23 +197,6 @@ typedef abi_int         target_pid_t;
 #define USE_ELF_CORE_DUMP
 #define ELF_EXEC_PAGESIZE       4096
 
-#if TARGET_BIG_ENDIAN
-#include "elf.h"
-#include "vdso-be8.c.inc"
-#include "vdso-be32.c.inc"
-
-static const VdsoImageInfo *vdso_image_info(uint32_t elf_flags)
-{
-    return (EF_ARM_EABI_VERSION(elf_flags) >= EF_ARM_EABI_VER4
-            && (elf_flags & EF_ARM_BE8)
-            ? &vdso_be8_image_info
-            : &vdso_be32_image_info);
-}
-#define vdso_image_info vdso_image_info
-#else
-# define VDSO_HEADER  "vdso-le.c.inc"
-#endif
-
 #else
 /* 64 bit ARM definitions */
 
@@ -2011,14 +1985,19 @@ static void load_elf_interp(const char *filename, 
struct image_info *info,
     load_elf_image(filename, &src, info, &ehdr, NULL);
 }
 
-#ifndef vdso_image_info
 #ifdef VDSO_HEADER
 #include VDSO_HEADER
-#define  vdso_image_info(flags)  &vdso_image_info
+const VdsoImageInfo *get_vdso_image_info(uint32_t elf_flags)
+{
+    return &vdso_image_info;
+}
 #else
-#define  vdso_image_info(flags)  NULL
+const VdsoImageInfo * __attribute__((weak))
+get_vdso_image_info(uint32_t elf_flags)
+{
+    return NULL;
+}
 #endif /* VDSO_HEADER */
-#endif /* vdso_image_info */
 
 static void load_elf_vdso(struct image_info *info, const VdsoImageInfo *vdso)
 {
@@ -2349,7 +2328,7 @@ int load_elf_binary(struct linux_binprm *bprm, struct 
image_info *info)
      * Load a vdso if available, which will amongst other things contain the
      * signal trampolines.  Otherwise, allocate a separate page for them.
      */
-    const VdsoImageInfo *vdso = vdso_image_info(info->elf_flags);
+    const VdsoImageInfo *vdso = get_vdso_image_info(info->elf_flags);
     if (vdso) {
         load_elf_vdso(&vdso_info, vdso);
         info->vdso = vdso_info.load_bias;
-- 
2.43.0


Reply via email to