From abbc0761fa0349d49b10dc8c0f10af6bc0578c40 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 12 May 2020 16:58:36 +0200 Subject: [PATCH 1/2] gcc10 arm64 build needs __getauxval for linking with libgcc Provide a new library libgcc-sup-.a that contains symbols needed by libgcc. This needs to be linked after -lgcc to provide any symbols missing which would normally be provided by glibc. At the moment this only provides __getauxval on arm64 linux. https://bugs.kde.org/show_bug.cgi?id=421321 Signed-off-by: Khem Raj Upstream-Status: Backport [https://sourceware.org/git/?p=valgrind.git;a=commit;h=abbc0761fa0349d49b10dc8c0f10af6bc0578c40] --- Makefile.tool.am | 3 +- coregrind/Makefile.am | 26 +++++++++++++++++ coregrind/m_libgcc_sup.c | 61 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 coregrind/m_libgcc_sup.c diff --git a/Makefile.tool.am b/Makefile.tool.am index cc2fa0ee6..2bf90de5d 100644 --- a/Makefile.tool.am +++ b/Makefile.tool.am @@ -17,7 +17,8 @@ TOOL_DEPENDENCIES_@VGCONF_PLATFORM_SEC_CAPS@ = \ endif -TOOL_LDADD_COMMON = -lgcc +TOOL_LDADD_COMMON = -lgcc \ + $(top_builddir)/coregrind/libgcc-sup-@VGCONF_ARCH_PRI@-@VGCONF_OS@.a TOOL_LDADD_@VGCONF_PLATFORM_PRI_CAPS@ = \ $(TOOL_DEPENDENCIES_@VGCONF_PLATFORM_PRI_CAPS@) $(TOOL_LDADD_COMMON) if VGCONF_HAVE_PLATFORM_SEC diff --git a/coregrind/Makefile.am b/coregrind/Makefile.am index 6a1a925fb..1753fb633 100644 --- a/coregrind/Makefile.am +++ b/coregrind/Makefile.am @@ -542,6 +542,32 @@ libcoregrind_@VGCONF_ARCH_SEC@_@VGCONF_OS@_a_DEPENDENCIES = \ libnolto_coregrind-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a endif +#---------------------------------------------------------------------------- +# libgcc-sup-.a +# Special supplemental library for functions normally supplied by glibc +# used by libgcc. +#---------------------------------------------------------------------------- + +pkglib_LIBRARIES += libgcc-sup-@VGCONF_ARCH_PRI@-@VGCONF_OS@.a +if VGCONF_HAVE_PLATFORM_SEC +pkglib_LIBRARIES += libgcc-sup-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a +endif + +libgcc_sup_@VGCONF_ARCH_PRI@_@VGCONF_OS@_a_SOURCES = \ + m_libgcc_sup.c +libgcc_sup_@VGCONF_ARCH_PRI@_@VGCONF_OS@_a_CPPFLAGS = \ + $(AM_CPPFLAGS_@VGCONF_PLATFORM_PRI_CAPS@) +libgcc_sup_@VGCONF_ARCH_PRI@_@VGCONF_OS@_a_CFLAGS = \ + $(AM_CFLAGS_PSO_@VGCONF_PLATFORM_PRI_CAPS@) +if VGCONF_HAVE_PLATFORM_SEC +libgcc_sup_@VGCONF_ARCH_SEC@_@VGCONF_OS@_a_SOURCES = \ + m_libgcc_sup.c +libgcc_sup_@VGCONF_ARCH_SEC@_@VGCONF_OS@_a_CPPFLAGS = \ + $(AM_CPPFLAGS_@VGCONF_PLATFORM_SEC_CAPS@) +libgcc_sup_@VGCONF_ARCH_SEC@_@VGCONF_OS@_a_CFLAGS = \ + $(AM_CFLAGS_PSO_@VGCONF_PLATFORM_SEC_CAPS@) +endif + #---------------------------------------------------------------------------- # libreplacemalloc_toolpreload-.a #---------------------------------------------------------------------------- diff --git a/coregrind/m_libgcc_sup.c b/coregrind/m_libgcc_sup.c new file mode 100644 index 000000000..e29325459 --- /dev/null +++ b/coregrind/m_libgcc_sup.c @@ -0,0 +1,61 @@ +/* -*- mode: C; c-basic-offset: 3; -*- */ + +/*--------------------------------------------------------------------*/ +/*--- Supplemental functions for libgcc normally provided by glibc ---*/ +/*--------------------------------------------------------------------*/ + +/* + This file is part of Valgrind, a dynamic binary instrumentation + framework. + + Copyright (C) 2020 Mark Wielaard + mark@klomp.org + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . + + The GNU General Public License is contained in the file COPYING. +*/ + +#include "config.h" +#include "pub_core_basics.h" +#include "pub_core_clientstate.h" + +/*====================================================================*/ +/*=== arm64 libgcc support function for init_have_lse_atomics ===*/ +/*====================================================================*/ + +#if defined(VGP_arm64_linux) +struct auxv +{ + Word a_type; + union { + void *a_ptr; + Word a_val; + } u; +}; +#define AT_NULL 0 + +unsigned long int __getauxval (unsigned long int type); +unsigned long int __getauxval (unsigned long int type) +{ + struct auxv *p; + for (p = (struct auxv *) VG_(client_auxv); + p != NULL && p->a_type != AT_NULL; + p++) + if (p->a_type == type) + return p->u.a_val; + + return 0; +} +#endif -- 2.26.2