[Debian-med-packaging] Bug#1006139: libdeflate FTBFS on armhf

Peter Green plugwash at debian.org
Fri Feb 25 22:53:42 GMT 2022


Wookey wrote:
> That seems an oversimplification. There is usually an FPU (almost
> always) and a neon unit (usually). The point is that their presence is
> not guaranteed

Debian armhf requires a FPU as part of the baseline. More than
that it requires a FPU as part of the ABI!

Andreas Tille wrote:
> It fails to build with
> 
>    lib/arm/crc32_impl.h:77:1: error: ‘-mfloat-abi=hard’: selected architecture lacks an FPU

This issue is caused by the way current versions of debian/ubuntu package/configure gcc

The gcc packaging used to specify cpu and fpu architectures separately, but now it specifies
the fpu as an extension of the cpu architecture using the "armv7-a+fp" syntax. The result of
this is if you override the CPU architecture on debian armhf you must also specify a fpu
(either using a seperate "mfpu" setting or using the syntax for CPU architecture extensions).
If you don't then gcc will assume you have no FPU and therefore that it is unable to implement
the hard float ABI.

The particular code in question seems to be an implementation of crc32 using the crc32 extension
added as an optional feature in armv8. From a quick look it appears to already be behind runtime
cpu detection.

At least gcc seems to think that on armv8 floating point and simd always go together, "+fp"
is not recognised as an extension to armv8, only "+simd". So I think Ubuntu's current patch
which changes the CPU settings for the code that uses the crc extension from an architecture
setting of "armv8+crc32" to and architecture setting of "armv8+simd+crc32" is correct for
Debian armhf.

You could however argue that it is not correct for Debian armel, I suspect it is possible in
theory to have an armv8 CPU that doesn't have any floating point or simd support, but does have
the crc32 extension and to run debian armel on such a CPU. In practice I suspect such CPUs are
likely to be like hens teeth and I suspect the compiler is unlikely to actually use any floating
point or simd instructions when compiling that function anyway.

Still if you want to be safer, you could do something like

--- a/lib/arm/crc32_impl.h
+++ b/lib/arm/crc32_impl.h
@@ -41,7 +41,11 @@
  #      ifdef __clang__
  #        define ATTRIBUTES	__attribute__((target("armv8-a,crc")))
  #      else
-#        define ATTRIBUTES	__attribute__((target("arch=armv8-a+crc")))
+#        ifdef __ARM_PCS_VFP
+#          define ATTRIBUTES	__attribute__((target("arch=armv8-a+simd+crc")))
+#        else
+#          define ATTRIBUTES	__attribute__((target("arch=armv8-a+crc")))
+#        endif
  #      endif
  #    else
  #      ifdef __clang__



More information about the Debian-med-packaging mailing list