[CRIU] [PATCH] pie: Give VDSO symbol table local scope

Christopher Covington cov at codeaurora.org
Sat Oct 3 05:47:26 PDT 2015


In commit c2271198, Laurent Dufour kindly reunified the VDSO code
that had become duplicated between architectures. Unfortunately
this introduced a regression in AArch64 where apparently due to
the scope of vdso_symbols array of pointers to characters changing
from local to global, load-time relocations became necessary.

The following thread on the GCC mailing list discusses why
load-time relocations can be necessary when pointers are used,
although it doesn't mention the potential for locally scoped
arrays to be handled differently:
https://gcc.gnu.org/ml/gcc/2004-05/msg01016.html

Because the alternatives, such as porting piegen to AArch64, are
far more involved, simply revert the change in scope.

Signed-off-by: Christopher Covington <cov at codeaurora.org>
---
 include/util-vdso.h | 4 ----
 pie/util-vdso.c     | 8 ++++----
 2 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/include/util-vdso.h b/include/util-vdso.h
index 2942337..c8dfa05 100644
--- a/include/util-vdso.h
+++ b/include/util-vdso.h
@@ -60,10 +60,6 @@ static inline unsigned long vvar_vma_size(struct vdso_symtable *t)
 	return t->vvar_end - t->vvar_start;
 }
 
-extern const char *vdso_symbols[VDSO_SYMBOL_MAX];
-
 extern int vdso_fill_symtable(char *mem, size_t size, struct vdso_symtable *t);
 
-
-
 #endif /* __CR_UTIL_VDSO_H__ */
diff --git a/pie/util-vdso.c b/pie/util-vdso.c
index 9711aaa..65746d9 100644
--- a/pie/util-vdso.c
+++ b/pie/util-vdso.c
@@ -24,10 +24,6 @@
 #endif
 #define LOG_PREFIX "vdso: "
 
-const char *vdso_symbols[VDSO_SYMBOL_MAX] = {
-	ARCH_VDSO_SYMBOLS
-};
-
 /* Check if pointer is out-of-bound */
 static bool __ptr_oob(void *ptr, void *start, size_t size)
 {
@@ -54,6 +50,10 @@ static unsigned long elf_hash(const unsigned char *name)
 
 int vdso_fill_symtable(char *mem, size_t size, struct vdso_symtable *t)
 {
+	const char *vdso_symbols[VDSO_SYMBOL_MAX] = {
+		ARCH_VDSO_SYMBOLS
+	};
+
 	Elf64_Phdr *dynamic = NULL, *load = NULL;
 	Elf64_Ehdr *ehdr = (void *)mem;
 	Elf64_Dyn *dyn_strtab = NULL;
-- 
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project



More information about the CRIU mailing list