Saturday, November 30, 2019

Re: "undefined reference to `__builtin_bswap64'" on mips64el/loongson

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCAAdFiEEiKQfd6o81mjI+LWALell7WOCXJMFAl3jFBEACgkQLell7WOC
XJNMZA//QyuHoDB/7lU//eMGNO4XsTmPKipBOhGkcQeA+Wy4Y9TC+PcCKpnLqFgw
z7zqP2IkKhHhhzJ0MR/LsVu61WWDM9zZbHIXN24Oy44wEZp3jIquF435JMx/F2eX
Hh7shcFm0yZjDxq5QcZlAlnkknFS4QXXkDyqkL+BlkivmgvUOdhIxqcbD5krY8z+
FzVQYrIDsLlT1nF5eW/tweoSrHyHebfSpwSkrMt9YksZPHErDaWbitvnN84BwV+c
oS1syiyt+4JQGT6+zNMmsbJ5h0V+ac0YXw+uV06OV8r/YP50OvpkokPGFHRwaQk9
4P1yuloGODEUFC4jEIDfTuXN1gy5lhXBZrEuEAa/Gn7Jl1OSRX7U3KTYSZH5HVyo
Rq6jAehICVjATnUczoKPhI7CtT8ji2ajTTLFLYfs+23vSXQVcQUMHlIsKIEqabmh
0nIA7XWvzXFKOFkyzHk6EgRFp7fq9txZyiVHXssCvE66HzbciW8n+W2BCk08XkmA
m/kSlZ2dIoszx3nzXWNl0TTc83ZpY49Qr8RRlX1xgUOyUuGfP9MRZVPdCl8Dy8Ut
E/XMuqvMFTXnL+nbq2UtCZTCl+MVkGqYPSXPoqBvB3xfm39ClHqBM/wJYAlQ0Y6z
Ax62nYWGK35/t9AEOy8j/ovkt5O/Y4TA934luAqFOtI/MZCVvts=
=NFbV
-----END PGP SIGNATURE-----
On 11/30/19 1:26 PM, George Koehler wrote:
> On Sat, 30 Nov 2019 01:10:56 -0800
> manphiz@gmail.com wrote:
>
>> Hi OpenBSD ports maintainers,
>>
>> I'm having trouble building security/libnettle on mips64el/loongson
>> which is caused by missing symbol of "__builtin_bswap64" when linking.
>> It looks like this symbol is introduced since GCC 4.3[1], while mips64el
>> ships with GCC 4.2.1. It's interesting because I can compile with the
>> symbol but cannot link. Would like to hear from the ports maintainers'
>> opinion on how to solve this issue?
>
> Bad luck! libnettle uses __builtin_bswap64 only on little-endian
> platforms. My big-endian powerpc/macppc also uses base-gcc 4.2.1 but
> can use the powerpc snapshot package of libnettle.
>
> The configure test for __builtin_bswap64 is wrong. It is a compile
> test, but you got a link error, not a compile error. Here is a diff
> to do a link test. On my powerpc with base-gcc, the compile test
> passed but the link test fails. The regression tests look good:
> "make test" reports "All 98 tests passed", "All 3 tests passed".
>
> For big endian, the test for __builtin_bswap64 should have no effect.
> For little endian, the failing test should disable a special case for
> block_size == 16 in WRKSRC/ctr.c ctr_crypt().
>
> Does this diff fix the problem on mips64el/longsoon?
>
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/security/libnettle/Makefile,v
> retrieving revision 1.24
> diff -u -p -r1.24 Makefile
> --- Makefile 29 Jun 2019 22:26:25 -0000 1.24
> +++ Makefile 30 Nov 2019 20:38:46 -0000
> @@ -4,6 +4,7 @@ COMMENT= cryptographic library
>
> DISTNAME= nettle-3.5.1
> PKGNAME= lib${DISTNAME}
> +REVISION= 0
>
> SHARED_LIBS += hogweed 3.0 # 6.5
> SHARED_LIBS += nettle 5.0 # 4.5
> Index: patches/patch-configure
> ===================================================================
> RCS file: /cvs/ports/security/libnettle/patches/patch-configure,v
> retrieving revision 1.8
> diff -u -p -r1.8 patch-configure
> --- patches/patch-configure 29 Jun 2019 22:26:25 -0000 1.8
> +++ patches/patch-configure 30 Nov 2019 20:38:46 -0000
> @@ -1,5 +1,8 @@
> $OpenBSD: patch-configure,v 1.8 2019/06/29 22:26:25 ajacoutot Exp $
>
> +The test for __builtin_bswap64 must fail if the linker can't find the
> +symbol. We need this for base-gcc on little endian, like mips64el.
> +
> Fix relocation errors on (at least) sparc64.
>
> We don't want extra debug flags in regular builds.
> @@ -7,6 +10,15 @@ We don't want extra debug flags in regul
> Index: configure
> --- configure.orig
> +++ configure
> +@@ -6062,7 +6062,7 @@ uint64_t y = __builtin_bswap64(x);
> + return 0;
> + }
> + _ACEOF
> +-if ac_fn_c_try_compile "$LINENO"; then :
> ++if ac_fn_c_try_link "$LINENO"; then :
> + nettle_cv_c_builtin_bswap64=yes
> + else
> + nettle_cv_c_builtin_bswap64=no
> @@ -6720,6 +6720,7 @@ else
> bsdi4.*) CCPIC="-fPIC" ;;
> bsdi*) CCPIC="" ;;
>

Thanks George! This patch works just fine!

BTW, I still wonder why GCC 4.2.1 on OpenBSD has the symbol but cannot
link it? It's more curious as this builtin should not be available till
GCC 4.3. Maybe the compiler needs to be fixed to avoid other configure
falsely detect it all together?

No comments:

Post a Comment