[Buildroot] [PATCH] package/gcc: Fix libs building on ARC700 with atomics
Peter Korsgaard
peter at korsgaard.com
Tue Nov 3 20:33:00 UTC 2020
>>>>> "Alexey" == Alexey Brodkin <Alexey.Brodkin at synopsys.com> writes:
> As we many times by now discussed that - some ARC cores might
> not have atomic instructions implemented. Namely that's ARC700
> w/o explicitly added atomics during design creation/configuration.
> Because of that when GCC gets configured for ARC700, i.e. via
> "--with-cpu=arc700" atomic ops are assumed disabled.
> Usually it's not a problem as we add "-matomics" in the wraper for
> building all packages if targets CPU has atomis (BR2_ARC_ATOMIC_EXT).
> But when bulding target's binaries which are essential parts of
> the GCC itself we don't use the wrapper. Instead xgcc is being used.
> That way we lose that important part of system's configuration about
> atomics and:
> 1. Atomic ops won't be used where otherwise they could have been used.
> 2. Some configuration checks might end-up thinking there're no atomics
> In particular (2) leads to pretty obscure failure on bulding of some
> packages which use C++, for example:
> log4cplus: http://autobuild.buildroot.net/results/a7732fdb2ba526a114d9fb759814236c5332f8d7
------------------------> 8--------------------
> ./.libs/liblog4cplus.so: undefined reference to `std::__atomic_futex_unsigned_base::_M_futex_notify_all(unsigned int*)'
> collect2: error: ld returned 1 exit status
------------------------> 8--------------------
> bitcoin: http://autobuild.buildroot.net/results/f73/f73d4c77e5fd6223abdbc83e344addcfc93227b8
------------------------> 8--------------------
> (.text+0x110c): undefined reference to
> `std::__atomic_futex_unsigned_base::_M_futex_wait_until(unsigned int*,
> unsigned int, bool, std::chrono::duration<long long, std::ratio<1ll,
1ll> >, std::chrono::duration<long long, std::ratio<1ll, 1000000000ll>
>> )'
> collect2: error: ld returned 1 exit status
------------------------> 8--------------------
> apcupsd: http://autobuild.buildroot.net/results/7a2/7a2cc7a4ac2237c185817f75e55e05d144efd100
------------------------> 8--------------------
> /tmp/instance-0/output-1/host/lib/gcc/arc-buildroot-linux-uclibc/9.3.1/../../../../arc-buildroot-linux-uclibc/bin/ld:
> eh_throw.cc:(.text._ZL23__gxx_exception_cleanup19_Unwind_Reason_CodeP17_Unwind_Exception+0x24):
> undefined reference to `__gnu_cxx::__exchange_and_add(int volatile*,
> int)'
> collect2: error: ld returned 1 exit status
------------------------> 8--------------------
> ...and many more.
> Interesting enough that was not seen earlier because "-matomic"
> used to be added in TARGET_{C|CXX}FLAGS via TARGET_ABI,
> but later "-matomic" was moved to ARCH_TOOLCHAIN_WRAPPER_OPTS, see
> https://git.buildroot.org/buildroot/commit/?id=c568b4f37fa6d7f51e6d14d33d7eb75dfe26d7bf
> and since then we started to see that new breakage which we now
> attempt to fix right where it hapens on GCC configuration.
> In contrast ARC HS family has atomic ops enabled by default thus
> we never spotted that kind of problem for it.
> More datails with analysis of what really happens under the hodd and
> how do error messages above are related to libs of GCC configuration could
> be found here: http://lists.busybox.net/pipermail/buildroot/2020-October/293614.html
> Signed-off-by: Alexey Brodkin <abrodkin at synopsys.com>
> Cc: Thomas Petazzoni <thomas.petazzoni at bootlin.com>
> Cc: Arnout Vandecappelle <arnout at mind.be>
> Cc: Peter Korsgaard <peter at korsgaard.com>
> Cc: Romain Naour <romain.naour at gmail.com>
> ---
> package/gcc/gcc.mk | 8 ++++++++
> 1 file changed, 8 insertions(+)
> diff --git a/package/gcc/gcc.mk b/package/gcc/gcc.mk
> index 114c2887a0..48974de2fa 100644
> --- a/package/gcc/gcc.mk
> +++ b/package/gcc/gcc.mk
> @@ -98,6 +98,14 @@ ifeq ($(BR2_ENABLE_DEBUG),y)
> GCC_COMMON_TARGET_CFLAGS += -Wno-error
> endif
> +# Make sure libgcc & libstdc++ always get built with -matomic on ARC700
> +ifeq ($(GCC_TARGET_CPU),arc700)
> +ifeq ($(BR2_ARC_ATOMIC_EXT),y)
NIT: These two conditions can be combined in a single ifeq:
ifeq ($(GCC_TARGET_CPU):$(BR2_ARC_ATOMIC_EXT),arc700:y)
Committed with that fixed, thanks.
--
Bye, Peter Korsgaard
More information about the buildroot
mailing list