Some libraries need -latomic on GCC ARM32
- Linguagem predominante
- C++
- Estrelas
- 18.1k
- Forks
- 3.2k
- Merge médio
- 20h 36min
- PRs com merge (30d)
- 1
Descrição
When compiling some of Abseil’s libraries on 32-bit ARM, GCC emits calls to functions contained in libatomic rather than in the compiler runtime. However, Abseil’s CMake build scripts do not set `-latomic` when building shared libraries (or when building against static ones). This results in link failures in reverse dependencies:
```console
$ uname -m
armv7l
$ cat stuff.cc
#include
int main() {
absl::InstallFailureSignalHandler(absl::FailureSignalHandlerOptions());
}
$ g++ -o stuff stuff.cc -labsl_failure_signal_handler
/usr/bin/ld: /usr/lib/arm-linux-gnueabi/libabsl_debugging_internal.so.20200923: undefined reference to `__atomic_compare_exchange_8'
/usr/bin/ld: /usr/lib/arm-linux-gnueabi/libabsl_spinlock_wait.so.20200923: undefined reference to `__atomic_load_8'
/usr/bin/ld: /usr/lib/arm-linux-gnueabi/libabsl_spinlock_wait.so.20200923: undefined reference to `__atomic_store_8'
collect2: error: ld returned 1 exit status
```
A similar failure occurs when taking an Abseil dependency via CMake. Explicitly linking against libatomic solves the issue:
```console
$ g++ -o stuff stuff.cc -l:libabsl_{failure_signal_handler,stacktrace,examine_stack,symbolize,malloc_internal,demangle_internal,debugging_internal,base,spinlock_wait,raw_logging_internal}.a -pthread -lm -latomic
```
This problem does not appear when using Clang, since Clang includes the atomic functions in compiler-rt rather than in a separate shared library.
I think this can be solved by sticking `-Wl,--as-needed -latomic -Wl,--no-as-needed` in appropriate places in the CMake files. This would give shared libraries a `DT_NEEDED` entry on libatomic.so on architectures where that’s necessary, and reverse dependencies linking static libraries would pick up the `-latomic` from abslTargets.cmake. I don’t think the Bazel rules need to change – this seems like the sort of thing that should go in a crosstool rather than individual BUILD files, especially given that it only applies to GCC.
**What version of Abseil are you using?**
20200923.1 LTS
**What operating system and version are you using**
Debian GNU/Linux, unstable, armel
**What compiler and version are you using?**
GCC 10.2.0:
```console
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabi/10/lto-wrapper
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Debian 10.2.0-16' --with-bugurl=file:///usr/share/doc/gcc-10/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-10 --program-prefix=arm-linux-gnueabi- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-sjlj-exceptions --with-arch=armv5te --with-float=soft --disable-werror --enable-checking=yes,extra,rtl --build=arm-linux-gnueabi --host=arm-linux-gnueabi --target=arm-linux-gnueabi
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.2.0 (Debian 10.2.0-16)
```
**What build system are you using?**
CMake
Guia de contribuição
Avaliação
Esta issue ainda não foi avaliada.