-latomic is needed on RISCV yet not auto-added by CMake, especially when intermediate static libraries are created
History:
https://github.com/riscv/riscv-gcc/issues/12
https://github.com/riscv/riscv-gcc/commit/2c4857d0981501b7c50bbf228de9e287611f8ae5
When using atomic, on RISCV64 one needs to add -latomic
. That is implemented via gcc spec file, and most things "just work"...
... unless one uses CMake. It seems like gcc is not used to link and one can end up with -latomic
to linked in.
Example is opendht project:
[ 70%] Linking CXX static library libopendht.a
/usr/bin/cmake -P CMakeFiles/opendht-static.dir/cmake_clean_target.cmake
/usr/bin/cmake -E cmake_link_script CMakeFiles/opendht-static.dir/link.txt --verbose=1
/usr/bin/ar qc libopendht.a CMakeFiles/opendht-static.dir/src/utils.cpp.o CMakeFiles/opendht-static.dir/src/infohash.cpp.o CMakeFiles/opendht-static.dir/src/crypto.cpp.o CMakeFiles/opendht-static.dir/src/default_types.cpp.o CMakeFiles/opendht-static.dir/src/node.cpp.o CMakeFiles/opendht-static.dir/src/value.cpp.o CMakeFiles/opendht-static.dir/src/dht.cpp.o CMakeFiles/opendht-static.dir/src/op_cache.cpp.o CMakeFiles/opendht-static.dir/src/callbacks.cpp.o CMakeFiles/opendht-static.dir/src/routing_table.cpp.o CMakeFiles/opendht-static.dir/src/node_cache.cpp.o CMakeFiles/opendht-static.dir/src/network_engine.cpp.o CMakeFiles/opendht-static.dir/src/securedht.cpp.o CMakeFiles/opendht-static.dir/src/dhtrunner.cpp.o CMakeFiles/opendht-static.dir/src/log.cpp.o CMakeFiles/opendht-static.dir/src/network_utils.cpp.o CMakeFiles/opendht-static.dir/src/thread_pool.cpp.o CMakeFiles/opendht-static.dir/src/peer_discovery.cpp.o
/usr/bin/ranlib libopendht.a
...
[ 77%] Linking CXX executable perftest
cd /<<PKGBUILDDIR>>/obj-riscv64-linux-gnu/tools && /usr/bin/cmake -E cmake_link_script CMakeFiles/perftest.dir/link.txt --verbose=1
/usr/bin/c++ -g -O2 -fdebug-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wno-return-type -Wall -Wextra -Wnon-virtual-dtor -pedantic-errors -fvisibility=hidden -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -rdynamic CMakeFiles/perftest.dir/perftest.cpp.o -o perftest -lreadline -lncurses ../libopendht.a -largon2 -lrt -ldl -lpthread -lgnutls -lnettle
/usr/bin/ld: ../libopendht.a(network_utils.cpp.o): in function `dht::net::UdpSocket::stop()':
./obj-riscv64-linux-gnu/./src/network_utils.cpp:350: undefined reference to `__atomic_exchange_1'
collect2: error: ld returned 1 exit status
make[3]: *** [tools/CMakeFiles/perftest.dir/build.make:91: tools/perftest] Error 1
Also rocksdb (stand alone, or as part of mariadb build)
31%] Linking CXX static library librocksdblib.a
cd /<<PKGBUILDDIR>>/builddir/storage/rocksdb && /usr/bin/cmake -P CMakeFiles/rocksdblib.dir/cmake_clean_target.cmake
cd /<<PKGBUILDDIR>>/builddir/storage/rocksdb && /usr/bin/cmake -E cmake_link_script CMakeFiles/rocksdblib.dir/link.txt --verbose=1
cd /<<PKGBUILDDIR>>/builddir/extra && /usr/bin/cmake -E copy_if_different /<<PKGBUILDDIR>>/builddir/include/mysqld_error.h.tmp /<<PKGBUILDDIR>>/builddir/include/mysqld_error.h
/usr/bin/ar qc librocksdblib.a CMakeFiles/...a long list of files...
...
[ 63%] Linking CXX executable sst_dump
cd /<<PKGBUILDDIR>>/builddir/storage/rocksdb && /usr/bin/cmake -E cmake_link_script CMakeFiles/sst_dump.dir/link.txt --verbose=1
/usr/bin/riscv64-linux-gnu-g++ -g -O2 -fdebug-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -pie -fPIC -Wl,-z,relro,-z,now -fstack-protector --param=ssp-buffer-size=4 -fno-rtti -O2 -g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -Wno-uninitialized -D_FORTIFY_SOURCE=2 -DDBUG_OFF -Wl,-z,relro -Wl,-z,now CMakeFiles/sst_dump.dir/rocksdb/tools/sst_dump.cc.o -o sst_dump -lpthread librocksdblib.a -llz4 -lsnappy -lzstd -lz -lpthread
...
/usr/bin/ld: librocksdblib.a(memtable.cc.o): in function `.L0 ':
./builddir/storage/rocksdb/./storage/rocksdb/rocksdb/util/dynamic_bloom.h:177: undefined reference to `__atomic_fetch_or_1'
/usr/bin/ld: librocksdblib.a(memtable.cc.o): in function `.LVL1731':
./builddir/storage/rocksdb/./storage/rocksdb/rocksdb/util/dynamic_bloom.h:179: undefined reference to `__atomic_fetch_or_1'
/usr/bin/ld: librocksdblib.a(memtable.cc.o): in function `SaveValue':
./builddir/storage/rocksdb/./storage/rocksdb/rocksdb/db/memtable.cc:596: undefined reference to `__atomic_compare_exchange_1'
/usr/bin/ld: librocksdblib.a(memtable.cc.o): in function `.L0 ':
/usr/include/c++/8/bits/atomic_base.h:434: undefined reference to `__atomic_compare_exchange_1'
/usr/bin/ld: /usr/include/c++/8/bits/atomic_base.h:434: undefined reference to `__atomic_compare_exchange_1'
/usr/bin/ld: /usr/include/c++/8/bits/atomic_base.h:434: undefined reference to `__atomic_compare_exchange_1'
/usr/bin/ld: /usr/include/c++/8/bits/atomic_base.h:434: undefined reference to `__atomic_compare_exchange_1'
/usr/bin/ld: librocksdblib.a(memtable.cc.o):/usr/include/c++/8/bits/atomic_base.h:434: more undefined references to `__atomic_compare_exchange_1' follow
collect2: error: ld returned 1 exit status
make[4]: *** [storage/rocksdb/CMakeFiles/sst_dump.dir/build.make:89: storage/rocksdb/sst_dump] Error 1
make[4]: Leaving directory '/<<PKGBUILDDIR>>/builddir'
make[3]: *** [CMakeFiles/Makefile2:7909: storage/rocksdb/CMakeFiles/sst_dump.dir/all] Error 2
make[3]: *** Waiting for unfinished jobs....
Can CMake use gcc to create static libraries, and link them with atomic as needed, on RISCV64? Otherwise lots and lots and lots of projects will need to do this https://github.com/facebook/rocksdb/pull/7060/files in their projects. Which is a lot of repeating.