When trying to build 8.1.0 on an Ubuntu 18.04 aarch64, I get the above error.
The offending code in `/util/cpuinfo-aarch64.c` is: ```c #ifdef CONFIG_LINUX unsigned long hwcap = qemu_getauxval(AT_HWCAP); info |= (hwcap & HWCAP_ATOMICS ? CPUINFO_LSE : 0); info |= (hwcap & HWCAP_USCAT ? CPUINFO_LSE2 : 0); info |= (hwcap & HWCAP_AES ? CPUINFO_AES: 0); #endif ``` The reason is that on this distribution the <bits/hwcap.h> header file does not define HWCAP_USCAT: ``` root@9c7ad90af4f8:/# cat /usr/include/aarch64-linux-gnu/bits/hwcap.h /* Defines for bits in AT_HWCAP. AArch64 Linux version. Copyright (C) 2016-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ #if !defined (_SYS_AUXV_H) # error "Never include <bits/hwcap.h> directly; use <sys/auxv.h> instead." #endif /* The following must match the kernel's <asm/hwcap.h>. */ #define HWCAP_FP (1 << 0) #define HWCAP_ASIMD (1 << 1) #define HWCAP_EVTSTRM (1 << 2) #define HWCAP_AES (1 << 3) #define HWCAP_PMULL (1 << 4) #define HWCAP_SHA1 (1 << 5) #define HWCAP_SHA2 (1 << 6) #define HWCAP_CRC32 (1 << 7) #define HWCAP_ATOMICS (1 << 8) #define HWCAP_FPHP (1 << 9) #define HWCAP_ASIMDHP (1 << 10) #define HWCAP_CPUID (1 << 11) #define HWCAP_ASIMDRDM (1 << 12) #define HWCAP_JSCVT (1 << 13) #define HWCAP_FCMA (1 << 14) #define HWCAP_LRCPC (1 << 15) #define HWCAP_DCPOP (1 << 16) #define HWCAP_SHA3 (1 << 17) #define HWCAP_SM3 (1 << 18) #define HWCAP_SM4 (1 << 19) #define HWCAP_ASIMDDP (1 << 20) #define HWCAP_SHA512 (1 << 21) #define HWCAP_SVE (1 << 22) root@9c7ad90af4f8:/# ``` The full list of definitions should include: ``` #define HWCAP_ASIMDFHM (1 << 23) #define HWCAP_DIT (1 << 24) #define HWCAP_USCAT (1 << 25) #define HWCAP_ILRCPC (1 << 26) #define HWCAP_FLAGM (1 << 27) #define HWCAP_SSBS (1 << 28) ``` I don't know the meaning behind these bits, and how important is for QEMU to correctly identify them all. Since I know my build environment, my quick and dirty workaround was to pass the definition via the preprocessor options: ``` CPPFLAGS+=" -DHWCAP_USCAT=(1<<25)" ``` However, for QEMU this is not a solution. A possible solution would be to compile the code conditionally: ``` #ifdef CONFIG_LINUX unsigned long hwcap = qemu_getauxval(AT_HWCAP); info |= (hwcap & HWCAP_ATOMICS ? CPUINFO_LSE : 0); #ifdef HWCAP_USCAT info |= (hwcap & HWCAP_USCAT ? CPUINFO_LSE2 : 0); #endif info |= (hwcap & HWCAP_AES ? CPUINFO_AES: 0); #endif ``` I don't know if other distributions are also affected, my build platform for all xPack standalone binaries is Ubuntu 18.04 LTS. I know that 18.04 is an old version, but I use the xPack QEMU mainly to run unit tests, and in some enterprise environments the machines used for testing are sometimes pretty outdated, thus 18.04 will remain the base build platform for a while. It would be very nice if QEMU would still compile on Ubuntu 18.04, as it did before 8.1.0. Regards, Liviu