1
0
mirror of https://git.yoctoproject.org/meta-arm synced 2026-04-20 11:29:54 +00:00

arm/optee-os: fix the optee-test build with GCC 10

GCC 10 calls __getauxval in some situations so backport some patches
from upstream to fix the linking with this symbol.

Change-Id: I68af7ff9d058b9f602f54350a35908d178a8e688
Signed-off-by: Ross Burton <ross.burton@arm.com>
Signed-off-by: Jon Mason <jon.mason@arm.com>
This commit is contained in:
Ross Burton
2020-11-02 15:33:37 +00:00
committed by Jon Mason
parent accb5d3bb4
commit 2b91b8383b
4 changed files with 164 additions and 1 deletions

View File

@@ -0,0 +1,62 @@
Upstream-Status: Backport
Signed-off-by: Ross Burton <ross.burton@arm.com>
From 36e784f621bf5d5be9183beba35f39426277c110 Mon Sep 17 00:00:00 2001
From: Volodymyr Babchuk <volodymyr_babchuk@epam.com>
Date: Tue, 13 Oct 2020 22:45:39 +0300
Subject: [PATCH 1/3] libutils: provide empty __getauxval() implementation
Never version of libgcc are built with LSE implementation in mind. To
determine if LSE is available on platform it calls __getauxval(), so in
some cases we can get undefined reference to __getauxval() error.
Prominent case is libgcc_eh.a library, which is used by C++ TAs. Exception
handler depends on atomic operations, so it tries to call
init_have_lse_atomics() first. This function in turn calls __getauxval(),
which causes linking error.
In the future we can make __getauxval() to return actual platform
capabilities.
Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@epam.com>
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
Reviewed-by: Jerome Forissier <jerome@forissier.org>
---
lib/libutils/ext/arch/arm/auxval.c | 12 ++++++++++++
lib/libutils/ext/arch/arm/sub.mk | 1 +
2 files changed, 13 insertions(+)
create mode 100644 lib/libutils/ext/arch/arm/auxval.c
diff --git a/lib/libutils/ext/arch/arm/auxval.c b/lib/libutils/ext/arch/arm/auxval.c
new file mode 100644
index 00000000..98bca850
--- /dev/null
+++ b/lib/libutils/ext/arch/arm/auxval.c
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: BSD-2-Clause
+/*
+ * Copyright (c) 2020, EPAM Systems
+ */
+
+#include <compiler.h>
+
+unsigned long int __getauxval (unsigned long int type);
+unsigned long int __getauxval (unsigned long int type __unused)
+{
+ return 0;
+}
diff --git a/lib/libutils/ext/arch/arm/sub.mk b/lib/libutils/ext/arch/arm/sub.mk
index dc5eed67..2e779066 100644
--- a/lib/libutils/ext/arch/arm/sub.mk
+++ b/lib/libutils/ext/arch/arm/sub.mk
@@ -3,6 +3,7 @@ srcs-$(CFG_ARM32_$(sm)) += aeabi_unwind.c
endif
srcs-$(CFG_ARM32_$(sm)) += atomic_a32.S
srcs-$(CFG_ARM64_$(sm)) += atomic_a64.S
+srcs-y += auxval.c
ifneq ($(sm),ldelf) # TA, core
srcs-$(CFG_ARM32_$(sm)) += mcount_a32.S
srcs-$(CFG_ARM64_$(sm)) += mcount_a64.S
--
2.25.1

View File

@@ -0,0 +1,55 @@
Upstream-Status: Backport
Signed-off-by: Ross Burton <ross.burton@arm.com>
From 73196b58ea6978ffa5e581738030f51c5789ef73 Mon Sep 17 00:00:00 2001
From: Volodymyr Babchuk <volodymyr_babchuk@epam.com>
Date: Tue, 13 Oct 2020 22:54:13 +0300
Subject: [PATCH 2/3] link.mk: implement support for libnames-after-libgcc
variable
Newer versions of libgcc depend on external __getauxval() symbol, which is
now provided by libutils. But libgcc is linked after libutils, so linker
can't resolve that symbol. We can't include libgcc into linking group with
libtutils, because libgcc provides symbols that conflict with libutil's
ones, like __aeabi_idiv with friends for instance.
So, to resolve libgcc dependency on libutils we need to link with libutils
second time. To make things more generic, we will introduce
$(libnames-after-libgcc) variable for libraries that should be linked after
libgcc.
Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@epam.com>
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
Reviewed-by: Jerome Forissier <jerome@forissier.org>
---
ta/arch/arm/link.mk | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/ta/arch/arm/link.mk b/ta/arch/arm/link.mk
index 445c285d..3025acb1 100644
--- a/ta/arch/arm/link.mk
+++ b/ta/arch/arm/link.mk
@@ -55,8 +55,11 @@ link-ldflags += --eh-frame-hdr
link-ldadd += $(libstdc++$(sm)) $(libgcc_eh$(sm))
endif
link-ldadd += --end-group
-ldargs-$(user-ta-uuid).elf := $(link-ldflags) $(objs) $(link-ldadd) $(libgcc$(sm))
+link-ldadd-after-libgcc += $(addprefix -l,$(libnames-after-libgcc))
+
+ldargs-$(user-ta-uuid).elf := $(link-ldflags) $(objs) $(link-ldadd) \
+ $(libgcc$(sm)) $(link-ldadd-after-libgcc)
link-script-cppflags-$(sm) := \
$(filter-out $(CPPFLAGS_REMOVE) $(cppflags-remove), \
@@ -76,6 +79,7 @@ $(link-script-pp$(sm)): $(link-script$(sm)) $(conf-file) $(link-script-pp-makefi
$(link-script-cppflags-$(sm)) $$< -o $$@
$(link-out-dir$(sm))/$(user-ta-uuid).elf: $(objs) $(libdeps) \
+ $(libdeps-after-libgcc) \
$(link-script-pp$(sm)) \
$(dynlistdep) \
$(additional-link-deps)
--
2.25.1

View File

@@ -0,0 +1,44 @@
Upstream-Status: Backport
Signed-off-by: Ross Burton <ross.burton@arm.com>
From f50962e3f56f0932662b2ffa10afe53339a335dd Mon Sep 17 00:00:00 2001
From: Volodymyr Babchuk <volodymyr_babchuk@epam.com>
Date: Fri, 16 Oct 2020 16:36:08 +0300
Subject: [PATCH 3/3] ta_dev_kit.mk: make sure that libutils is linked second
time
libgcc depends on __getauxval symbol from libuils. As, generally libutils
is linked before libgcc, we will get "unresolved symbol" error. To resolve
this dependency we need to link libutils second time - after libgcc.
Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@epam.com>
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
Reviewed-by: Jerome Forissier <jerome@forissier.org>
---
ta/mk/ta_dev_kit.mk | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/ta/mk/ta_dev_kit.mk b/ta/mk/ta_dev_kit.mk
index e28be677..d0e66317 100644
--- a/ta/mk/ta_dev_kit.mk
+++ b/ta/mk/ta_dev_kit.mk
@@ -78,6 +78,16 @@ endif
libnames += dl
libdeps += $(ta-dev-kit-dir$(sm))/lib/libdl.a
+# libutils provides __getauxval symbol which is needed by libgcc 10.x. We can't
+# link libutils after libgcc, because libgcc will replace some symbols provided
+# by libutils, which will cause further linking issues.
+#
+# But if we place libutils before libgcc, linker will not be able to resolve
+# __getauxval. So we need to link with libutils twice: before and after libgcc.
+# Hence it included both in $(libnames) and in $(libnames-after-libgcc)
+libnames-after-libgcc += utils
+libdeps-after-libgcc += $(ta-dev-kit-dir$(sm))/lib/libutils.a
+
# Pass config variable (CFG_) from conf.mk on the command line
cppflags$(sm) += $(strip \
$(foreach var, $(filter CFG_%,$(.VARIABLES)), \
--
2.25.1

View File

@@ -5,5 +5,7 @@ SRCREV = "c4def2a8262a03244d9a88461699b9b8e43c6b55"
SRC_URI_append = " \
file://0006-allow-setting-sysroot-for-libgcc-lookup.patch \
file://0007-allow-setting-sysroot-for-clang.patch \
file://0001-libutils-provide-empty-__getauxval-implementation.patch \
file://0002-link.mk-implement-support-for-libnames-after-libgcc-.patch \
file://0003-ta_dev_kit.mk-make-sure-that-libutils-is-linked-seco.patch \
"