[MDEV-23137] RocksDB fails to build on arm64: undefined reference to `crc32c_arm64(unsigned int, unsigned char const*, unsigned int)' Created: 2020-07-09  Updated: 2020-07-28  Resolved: 2020-07-28

Status: Closed
Project: MariaDB Server
Component/s: Storage Engine - RocksDB
Affects Version/s: 10.2.32, 10.3.23, 10.4.13
Fix Version/s: 10.2.33, 10.3.24, 10.4.14, 10.5.5

Type: Bug Priority: Major
Reporter: Thomas Deutschmann Assignee: Daniel Black
Resolution: Fixed Votes: 0
Labels: None
Environment:

System uname: Linux-4.9.0-4-arm64-aarch64-with-gentoo-2.6
KiB Mem: 131544964 total, 110798500 free
KiB Swap: 3321056 total, 2284108 free
Timestamp of repository gentoo: Thu, 09 Jul 2020 21:35:25 +0000
sh bash 5.0_p17
ld GNU ld (Gentoo 2.33.1 p2) 2.33.1
ccache version 3.7.9 [disabled]
app-shells/bash: 5.0_p17::gentoo
dev-java/java-config: 2.3.1::gentoo
dev-lang/perl: 5.30.3::gentoo
dev-lang/python: 2.7.18::gentoo, 3.6.11-r1::gentoo, 3.7.8-r1::gentoo, 3.8.3-r1::gentoo
dev-util/ccache: 3.7.9::gentoo
dev-util/cmake: 3.16.5::gentoo
sys-apps/baselayout: 2.6-r1::gentoo
sys-apps/openrc: 0.42.1::gentoo
sys-apps/sandbox: 2.18::gentoo
sys-devel/autoconf: 2.13-r1::gentoo, 2.69-r4::gentoo
sys-devel/automake: 1.16.1-r1::gentoo
sys-devel/binutils: 2.33.1-r1::gentoo
sys-devel/gcc: 9.3.0::gentoo
sys-devel/gcc-config: 2.2.1::gentoo
sys-devel/libtool: 2.4.6-r6::gentoo
sys-devel/make: 4.2.1-r4::gentoo
sys-kernel/linux-headers: 5.4-r1::gentoo (virtual/os-headers)
sys-libs/glibc: 2.30-r8::gentoo



 Description   

Building MariaDB with RocksDB enabled on arm64 is failing:

>>> Configuring source in /var/tmp/portage/dev-db/mariadb-10.2.32/work/mysql ...
>>> Working in BUILD_DIR: "/var/tmp/portage/dev-db/mariadb-10.2.32/work/mariadb-10.2.32_build"
cmake -C /var/tmp/portage/dev-db/mariadb-10.2.32/work/mariadb-10.2.32_build/gentoo_common_config.cmake -G Unix Makefiles -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_C_FLAGS_RELWITHDEBINFO=-DNDEBUG -DCMAKE_CXX_FLAGS_RELWITHDEBINFO=-DNDEBUG -DMYSQL_DATADIR=/var/lib/mysql -DSYSCONFDIR=/etc/mysql -DINSTALL_BINDIR=bin -DINSTALL_DOCDIR=share/doc/mariadb-10.2.32 -DINSTALL_DOCREADMEDIR=share/doc/mariadb-10.2.32 -DINSTALL_INCLUDEDIR=include/mysql -DINSTALL_INFODIR=share/info -DINSTALL_LIBDIR=lib64 -DINSTALL_MANDIR=share/man -DINSTALL_MYSQLSHAREDIR=share/mariadb -DINSTALL_PLUGINDIR=lib64/mariadb/plugin -DINSTALL_SCRIPTDIR=share/mariadb/scripts -DINSTALL_MYSQLDATADIR=/var/lib/mysql -DINSTALL_SBINDIR=sbin -DINSTALL_SUPPORTFILESDIR=/usr/share/mariadb -DWITH_COMMENT=Gentoo Linux mariadb-10.2.32 -DWITH_UNIT_TESTS=OFF -DWITH_LIBEDIT=0 -DWITH_ZLIB=system -DWITHOUT_LIBWRAP=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_UNIX_ADDR=/var/run/mysqld/mysqld.sock -DINSTALL_UNIX_ADDRDIR=/var/run/mysqld/mysqld.sock -DWITH_DEFAULT_COMPILER_OPTIONS=0 -DWITH_DEFAULT_FEATURE_SET=0 -DINSTALL_SYSTEMD_UNITDIR=/lib/systemd/system -DSTACK_DIRECTION=-1 -DPKG_CONFIG_EXECUTABLE=/usr/bin/aarch64-unknown-linux-gnu-pkg-config -DPLUGIN_AUTH_GSSAPI=DYNAMIC -DAUTH_GSSAPI_PLUGIN_TYPE=DYNAMIC -DCONC_WITH_EXTERNAL_ZLIB=YES -DWITH_EXTERNAL_ZLIB=YES -DSUFFIX_INSTALL_DIR= -DWITH_UNITTEST=OFF -DWITHOUT_CLIENTLIBS=YES -DCLIENT_PLUGIN_DIALOG=OFF -DCLIENT_PLUGIN_AUTH_GSSAPI_CLIENT=OFF -DCLIENT_PLUGIN_CLIENT_ED25519=OFF -DCLIENT_PLUGIN_MYSQL_CLEAR_PASSWORD=STATIC -DCLIENT_PLUGIN_CACHING_SHA2_PASSWORD=OFF -DINSTALL_MYSQLTESTDIR= -DWITH_SSL=system -DCLIENT_PLUGIN_SHA256_PASSWORD=STATIC -DWITH_READLINE=0 -DNOT_FOR_DISTRIBUTION=1 -DENABLE_DTRACE=yes -DPLUGIN_FEDERATED=NO -DPLUGIN_FEDERATEDX=NO -DWITH_JEMALLOC=no -DWITH_PCRE=system -DPLUGIN_OQGRAPH=DYNAMIC -DPLUGIN_SPHINX=NO -DPLUGIN_TOKUDB=NO -DPLUGIN_AUTH_PAM=YES -DPLUGIN_CRACKLIB_PASSWORD_CHECK=YES -DPLUGIN_CASSANDRA=NO -DPLUGIN_SEQUENCE=NO -DPLUGIN_SPIDER=NO -DPLUGIN_CONNECT=NO -DCONNECT_WITH_MYSQL=1 -DCONNECT_WITH_LIBXML2=yes -DCONNECT_WITH_ODBC=no -DCONNECT_WITH_JDBC=no -DCONNECT_WITH_MONGO=OFF -DWITH_WSREP=no -DWITH_INNODB_LZ4=ON -DWITH_INNODB_LZO=OFF -DWITH_INNODB_SNAPPY=OFF -DPLUGIN_MROONGA=NO -DPLUGIN_AUTH_GSSAPI=DYNAMIC -DWITH_MARIABACKUP=ON -DWITH_LIBARCHIVE=ON -DINSTALL_SQLBENCHDIR=share/mariadb -DPLUGIN_ROCKSDB=DYNAMIC -DWITH_SYSTEMD=no -DWITH_NUMA=ON -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all -DMYSQL_USER=mysql -DDISABLE_SHARED=NO -DWITH_DEBUG=no -DWITH_EMBEDDED_SERVER=OFF -DWITH_PROFILING=yes -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_CSV_STORAGE_ENGINE=1 -DWITH_HEAP_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MYISAMMRG_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_TOOLCHAIN_FILE=/var/tmp/portage/dev-db/mariadb-10.2.32/work/mariadb-10.2.32_build/gentoo_toolchain.cmake
[...]
[ 95%] Building CXX object sql/CMakeFiles/sql.dir/threadpool_generic.cc.o
cd /var/tmp/portage/dev-db/mariadb-10.2.32/work/mariadb-10.2.32_build/sql && /usr/bin/aarch64-unknown-linux-gnu-g++ -DDBUG_TRACE -DHAVE_CONFIG_H -DHAVE_EVENT_SCHEDULER -DHAVE_OPENSSL -DHAVE_POOL_OF_THREADS -DMYSQL_SERVER -D_FILE_OFFSET_BITS=64 -I/var/tmp/portage/dev-db/mariadb-10.2.32/work/mariadb-10.2.32_build/include -I/var/tmp/portage/dev-db/mariadb-10.2.32/work/mysql/include -I/var/tmp/portage/dev-db/mariadb-10.2.32/work/mysql/sql -I/var/tmp/portage/dev-db/mariadb-10.2.32/work/mariadb-10.2.32_build/sql   -O2 -pipe -march=native -felide-constructors -fno-strict-aliasing -pie -fPIC -Wl,-z,relro,-z,now -fstack-protector --param=ssp-buffer-size=4 -fno-rtti -DNDEBUG -D_FORTIFY_SOURCE=2 -DDBUG_OFF -Wall -Wextra -Wformat-security -Wno-format-truncation -Wno-init-self -Wno-nonnull-compare -Wno-unused-parameter -Woverloaded-virtual -Wvla -Wwrite-strings   -o CMakeFiles/sql.dir/threadpool_generic.cc.o -c /var/tmp/portage/dev-db/mariadb-10.2.32/work/mysql/sql/threadpool_generic.cc
/usr/lib/gcc/aarch64-unknown-linux-gnu/9.3.0/../../../../aarch64-unknown-linux-gnu/bin/ld: librocksdblib.a(crc32c.cc.o): in function `rocksdb::crc32c::ExtendARMImpl(unsigned int, char const*, unsigned long)':
crc32c.cc:(.text+0x0): undefined reference to `crc32c_arm64(unsigned int, unsigned char const*, unsigned int)'
/usr/lib/gcc/aarch64-unknown-linux-gnu/9.3.0/../../../../aarch64-unknown-linux-gnu/bin/ld: librocksdblib.a(crc32c.cc.o): in function `rocksdb::crc32c::IsFastCrc32Supported[abi:cxx11]()':
crc32c.cc:(.text+0x280): undefined reference to `crc32c_runtime_check()'
/usr/lib/gcc/aarch64-unknown-linux-gnu/9.3.0/../../../../aarch64-unknown-linux-gnu/bin/ld: librocksdblib.a(crc32c.cc.o): in function `_GLOBAL__sub_I_crc32c.cc':
crc32c.cc:(.text.startup+0x8): undefined reference to `crc32c_runtime_check()'
collect2: error: ld returned 1 exit status
make[2]: *** [storage/rocksdb/CMakeFiles/sst_dump.dir/build.make:90: storage/rocksdb/sst_dump] Error 1
make[2]: Leaving directory '/var/tmp/portage/dev-db/mariadb-10.2.32/work/mariadb-10.2.32_build'
make[1]: *** [CMakeFiles/Makefile2:2909: storage/rocksdb/CMakeFiles/sst_dump.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

Downstream bug report with full build.log: https://bugs.gentoo.org/731998



 Comments   
Comment by Marko Mäkelä [ 2020-07-10 ]

In the build.log.xz I do not see any reference to util/crc32c_arm64.cc. In storage/rocksdb/rocksdb/CMakeLists.txt there is the following code:

if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")
        CHECK_C_COMPILER_FLAG("-march=armv8-a+crc+crypto" HAS_ARMV8_CRC)
  if(HAS_ARMV8_CRC)
    message(STATUS " HAS_ARMV8_CRC yes")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a+crc+crypto -Wno-unused-function")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a+crc+crypto -Wno-unused-function")
  endif(HAS_ARMV8_CRC)
endif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64")

if(HAS_ARMV8_CRC)
  list(APPEND SOURCES
    util/crc32c_arm64.cc)
endif(HAS_ARMV8_CRC)

The build log does not refer to HAS_ARMV8_CRC or either. There should be a separate file that contains the results of all cmake checks. I would suggest you to figure out why HAS_ARMV8_CRC is not being set.

This submodule is pointing to https://github.com/facebook/rocksdb which we do not control directly. MariaDB seems to be missing some changes to the CMakeListst.txt, mostly related to the POWER 9 processor, but apparently nothing related to the ARMv8 a.k.a. ARM64 instruction set architecture.

Comment by Daniel Black [ 2020-07-12 ]

storage/rocksdb/rocksdb/CMakeLists.txt isn't used by MariaDB. Its logic is in storage/rocksdb/build_rocksdb.cmake which includes no logic mentioned above.

Comment by Daniel Black [ 2020-07-28 ]

Thanks krunalbauskar for the PR.

Thanks marko for the review.

Comment by Mingli-Yu [ 2020-07-28 ]

Actually the issue also occurs in 10.5.4 and the commit https://github.com/MariaDB/server/commit/d88ea260882ca414e940cd6af225617f00503f71 also needed for 10.5.

Comment by Daniel Black [ 2020-07-28 ]

The 10.2 where it was merged will be merged up to 10.5 before the 10.5.5 release.

Comment by Mingli-Yu [ 2020-07-28 ]

Thanks Daniel Black's update.

Generated at Thu Feb 08 09:20:07 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.