Older versions of the Arm architecture lack support for __sync operations directly in hardware and require calls into appropriate operating-system hooks. But such hooks obviously don't exist in a freestanding environment.
Consquently, it is incorrect to assume during configure that such functions will exist and we need a configure-time check to determine whether or not these routines will work. libbacktrace: * configure.ac: Always check if the compiler supports __sync operations. * configure: Regenerated. --- A consequence of this assumption that these functions 'just work' (TM) is that we build libbacktrace with threading support, but that then fails at link time when we find out that they do not. I'm not sure I really understand why we can assume that having with_target_subdir set is enough to assume that the operations exist: it isn't for Arm and it looks like it wasn't for hpux either. Perhaps the whole logic here needs reconsideration... libbacktrace/configure | 23 +++++++++++++++++++++++ libbacktrace/configure.ac | 10 ++++++++++ 2 files changed, 33 insertions(+) diff --git a/libbacktrace/configure b/libbacktrace/configure index db491a78234..0ecdd3ec0a3 100755 --- a/libbacktrace/configure +++ b/libbacktrace/configure @@ -12760,6 +12760,29 @@ else if test -n "${with_target_subdir}"; then case "${host}" in hppa*-*-hpux*) libbacktrace_cv_sys_sync=no ;; + arm*-*-eabi*) + # Older versions of the Arm architecture lack the necessary instructions + # for these constructs, so check whether we can use them. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int i; +int +main () +{ +__sync_bool_compare_and_swap (&i, i, i); + __sync_lock_test_and_set (&i, 1); + __sync_lock_release (&i); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + libbacktrace_cv_sys_sync=yes +else + libbacktrace_cv_sys_sync=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext;; *) libbacktrace_cv_sys_sync=yes ;; esac else diff --git a/libbacktrace/configure.ac b/libbacktrace/configure.ac index b700bf9d4f9..75b3a7536f1 100644 --- a/libbacktrace/configure.ac +++ b/libbacktrace/configure.ac @@ -199,6 +199,16 @@ AC_CACHE_CHECK([__sync extensions], [if test -n "${with_target_subdir}"; then case "${host}" in hppa*-*-hpux*) libbacktrace_cv_sys_sync=no ;; + arm*-*-eabi*) + # Older versions of the Arm architecture lack the necessary instructions + # for these constructs, so check whether we can use them. + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([int i;], + [__sync_bool_compare_and_swap (&i, i, i); + __sync_lock_test_and_set (&i, 1); + __sync_lock_release (&i);])], + [libbacktrace_cv_sys_sync=yes], + [libbacktrace_cv_sys_sync=no]);; *) libbacktrace_cv_sys_sync=yes ;; esac else -- 2.34.1