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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 \
|
||||
"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user