]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
gcc10 arm64 build needs __getauxval for linking with libgcc
authorMark Wielaard <mark@klomp.org>
Tue, 12 May 2020 14:58:36 +0000 (16:58 +0200)
committerMark Wielaard <mark@klomp.org>
Fri, 15 May 2020 13:22:14 +0000 (15:22 +0200)
Provide a new library libgcc-sup-<platform>.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

Makefile.tool.am
coregrind/Makefile.am
coregrind/m_libgcc_sup.c [new file with mode: 0644]

index cc2fa0ee6fa42e99141c6466e14b9c365b107c04..2bf90de5da6d9e90cf73cc910552753aff4ccb67 100644 (file)
@@ -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
index 6a1a925fb58731fae14f7d50f47fc14677228378..1753fb633c53b9393d2b9b5291317324ccf7604b 100644 (file)
@@ -542,6 +542,32 @@ libcoregrind_@VGCONF_ARCH_SEC@_@VGCONF_OS@_a_DEPENDENCIES = \
     libnolto_coregrind-@VGCONF_ARCH_SEC@-@VGCONF_OS@.a
 endif
 
+#----------------------------------------------------------------------------
+# libgcc-sup-<platform>.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-<platform>.a
 #----------------------------------------------------------------------------
diff --git a/coregrind/m_libgcc_sup.c b/coregrind/m_libgcc_sup.c
new file mode 100644 (file)
index 0000000..e293254
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+
+   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