poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: GNU poke 3.90.2 link error due to libbnd


From: Jose E. Marchesi
Subject: Re: GNU poke 3.90.2 link error due to libbnd
Date: Sat, 10 Feb 2024 01:13:21 +0100
User-agent: Gnus/5.13 (Gnus v5.13)

Hi Bruno.

Thanks for the patch.
Please install in both master and maint/poke-4.
Thanks!

> Ubuntu 22.04/x86_64 is a bi-arch system. Actually even a tri-arch
> system: One can install binaries in each of the following ABIs:
>   64
>   32
>   x32
>
> I have installed libbnd (as an Ubuntu package) in 64-bit mode only:
>   /usr/include/libnbd.h
>   /usr/lib/x86_64-linux-gnu/libnbd.a
>   /usr/lib/x86_64-linux-gnu/libnbd.so
>   /usr/lib/x86_64-linux-gnu/libnbd.so.0
>   /usr/lib/x86_64-linux-gnu/libnbd.so.0.0.0
> exist, but
>   /usr/i686-linux-gnu/lib/libnbd.*
> and
>   /usr/x86_64-linux-gnux32/lib/libnbd.*
> do not exist.
>
> During the configure step, for each of the three ABIs, configure
> detects
>
>   checking for libnbd... yes
>
> In the 32-bit and x32 ABIs, there is then an error while linking libpoke:
>
> /bin/bash ../libtool  --tag=CC   --mode=link i686-linux-gnu-gcc-11 -Wall   -g 
> -O2 -version-info 1:0:0 -lc -no-undefined -L/inst-x86_64-32/lib -o libpoke.la 
> -rpath /inst-x86_64-32/lib libpoke_la-libpoke.lo libpoke_la-pk-val.lo 
> libpoke_la-pkl.lo libpoke_la-pkl-ast.lo libpoke_la-pkl-env.lo 
> libpoke_la-pkl-pass.lo libpoke_la-pkl-promo.lo libpoke_la-pkl-fold.lo 
> libpoke_la-pkl-typify.lo libpoke_la-pkl-anal.lo libpoke_la-pkl-trans.lo 
> libpoke_la-pkl-tab.lo libpoke_la-pkl-lex.lo libpoke_la-pkl-gen.lo 
> libpoke_la-pkl-asm.lo libpoke_la-pkl-diag.lo libpoke_la-pkl-parser.lo 
> libpoke_la-pvm.lo libpoke_la-pvm-val.lo libpoke_la-pvm-env.lo 
> libpoke_la-pvm-alloc.lo libpoke_la-pvm-program.lo libpoke_la-pvm-wrappers.lo 
> libpoke_la-ios.lo libpoke_la-ios-dev-file.lo libpoke_la-ios-dev-mem.lo 
> libpoke_la-ios-dev-zero.lo libpoke_la-ios-dev-sub.lo libpoke_la-ios-buffer.lo 
> libpoke_la-ios-dev-stream.lo ../common/libpoke_la-pk-utils.lo 
> libpoke_la-ios-dev-mmap.lo libpoke_la-ios-dev-nbd.lo 
> libpoke_la-ios-dev-proc.lo ../gl-libpoke/libgnu.la libpvmjitter.la -lgc -lnbd 
> libtool: link: i686-linux-gnu-gcc-11 -shared  -fPIC -DPIC  
> .libs/libpoke_la-libpoke.o .libs/libpoke_la-pk-val.o .libs/libpoke_la-pkl.o 
> .libs/libpoke_la-pkl-ast.o .libs/libpoke_la-pkl-env.o 
> .libs/libpoke_la-pkl-pass.o .libs/libpoke_la-pkl-promo.o 
> .libs/libpoke_la-pkl-fold.o .libs/libpoke_la-pkl-typify.o 
> .libs/libpoke_la-pkl-anal.o .libs/libpoke_la-pkl-trans.o 
> .libs/libpoke_la-pkl-tab.o .libs/libpoke_la-pkl-lex.o 
> .libs/libpoke_la-pkl-gen.o .libs/libpoke_la-pkl-asm.o 
> .libs/libpoke_la-pkl-diag.o .libs/libpoke_la-pkl-parser.o 
> .libs/libpoke_la-pvm.o .libs/libpoke_la-pvm-val.o .libs/libpoke_la-pvm-env.o 
> .libs/libpoke_la-pvm-alloc.o .libs/libpoke_la-pvm-program.o 
> .libs/libpoke_la-pvm-wrappers.o .libs/libpoke_la-ios.o 
> .libs/libpoke_la-ios-dev-file.o .libs/libpoke_la-ios-dev-mem.o 
> .libs/libpoke_la-ios-dev-zero.o .libs/libpoke_la-ios-dev-sub.o 
> .libs/libpoke_la-ios-buffer.o .libs/libpoke_la-ios-dev-stream.o 
> ../common/.libs/libpoke_la-pk-utils.o .libs/libpoke_la-ios-dev-mmap.o 
> .libs/libpoke_la-ios-dev-nbd.o .libs/libpoke_la-ios-dev-proc.o  
> -Wl,--whole-archive ../gl-libpoke/.libs/libgnu.a ./.libs/libpvmjitter.a 
> -Wl,--no-whole-archive  -Wl,-rpath -Wl,/inst-x86_64-32/lib -Wl,-rpath 
> -Wl,/inst-x86_64-32/lib -lc -L/inst-x86_64-32/lib 
> -L/build/poke-3.90.2/build-32/jitter/lib -lncurses -lm 
> /inst-x86_64-32/lib/libgc.so -lnbd  -g -O2   -Wl,-soname -Wl,libpoke.so.1 -o 
> .libs/libpoke.so.1.0.0
> /usr/lib/gcc-cross/i686-linux-gnu/11/../../../../i686-linux-gnu/bin/ld: 
> cannot find -lnbd: No such file or directory
> collect2: error: ld returned 1 exit status
> make[3]: *** [Makefile:3042: libpoke.la] Error 1
>
> /bin/bash ../libtool  --tag=CC   --mode=link 
> /usr/bin/x86_64-linux-gnux32-gcc-11 -Wall   -g -O2 -version-info 1:0:0 -lc 
> -no-undefined -L/inst-x86_64-x32/lib -o libpoke.la -rpath 
> /inst-x86_64-x32/lib libpoke_la-libpoke.lo libpoke_la-pk-val.lo 
> libpoke_la-pkl.lo libpoke_la-pkl-ast.lo libpoke_la-pkl-env.lo 
> libpoke_la-pkl-pass.lo libpoke_la-pkl-promo.lo libpoke_la-pkl-fold.lo 
> libpoke_la-pkl-typify.lo libpoke_la-pkl-anal.lo libpoke_la-pkl-trans.lo 
> libpoke_la-pkl-tab.lo libpoke_la-pkl-lex.lo libpoke_la-pkl-gen.lo 
> libpoke_la-pkl-asm.lo libpoke_la-pkl-diag.lo libpoke_la-pkl-parser.lo 
> libpoke_la-pvm.lo libpoke_la-pvm-val.lo libpoke_la-pvm-env.lo 
> libpoke_la-pvm-alloc.lo libpoke_la-pvm-program.lo libpoke_la-pvm-wrappers.lo 
> libpoke_la-ios.lo libpoke_la-ios-dev-file.lo libpoke_la-ios-dev-mem.lo 
> libpoke_la-ios-dev-zero.lo libpoke_la-ios-dev-sub.lo libpoke_la-ios-buffer.lo 
> libpoke_la-ios-dev-stream.lo ../common/libpoke_la-pk-utils.lo 
> libpoke_la-ios-dev-mmap.lo libpoke_la-ios-dev-nbd.lo 
> libpoke_la-ios-dev-proc.lo ../gl-libpoke/libgnu.la libpvmjitter.la -lgc -lnbd 
> libtool: link: /usr/bin/x86_64-linux-gnux32-gcc-11 -shared  -fPIC -DPIC  
> .libs/libpoke_la-libpoke.o .libs/libpoke_la-pk-val.o .libs/libpoke_la-pkl.o 
> .libs/libpoke_la-pkl-ast.o .libs/libpoke_la-pkl-env.o 
> .libs/libpoke_la-pkl-pass.o .libs/libpoke_la-pkl-promo.o 
> .libs/libpoke_la-pkl-fold.o .libs/libpoke_la-pkl-typify.o 
> .libs/libpoke_la-pkl-anal.o .libs/libpoke_la-pkl-trans.o 
> .libs/libpoke_la-pkl-tab.o .libs/libpoke_la-pkl-lex.o 
> .libs/libpoke_la-pkl-gen.o .libs/libpoke_la-pkl-asm.o 
> .libs/libpoke_la-pkl-diag.o .libs/libpoke_la-pkl-parser.o 
> .libs/libpoke_la-pvm.o .libs/libpoke_la-pvm-val.o .libs/libpoke_la-pvm-env.o 
> .libs/libpoke_la-pvm-alloc.o .libs/libpoke_la-pvm-program.o 
> .libs/libpoke_la-pvm-wrappers.o .libs/libpoke_la-ios.o 
> .libs/libpoke_la-ios-dev-file.o .libs/libpoke_la-ios-dev-mem.o 
> .libs/libpoke_la-ios-dev-zero.o .libs/libpoke_la-ios-dev-sub.o 
> .libs/libpoke_la-ios-buffer.o .libs/libpoke_la-ios-dev-stream.o 
> ../common/.libs/libpoke_la-pk-utils.o .libs/libpoke_la-ios-dev-mmap.o 
> .libs/libpoke_la-ios-dev-nbd.o .libs/libpoke_la-ios-dev-proc.o  
> -Wl,--whole-archive ../gl-libpoke/.libs/libgnu.a ./.libs/libpvmjitter.a 
> -Wl,--no-whole-archive  -Wl,-rpath -Wl,/inst-x86_64-x32/lib -Wl,-rpath 
> -Wl,/inst-x86_64-x32/lib -lc -L/inst-x86_64-x32/lib 
> -L/build/poke-3.90.2/build-x32/jitter/lib /inst-x86_64-x32/lib/libgc.so -lnbd 
>  -g -O2   -Wl,-soname -Wl,libpoke.so.1 -o .libs/libpoke.so.1.0.0
> /usr/lib/gcc-cross/x86_64-linux-gnux32/11/../../../../x86_64-linux-gnux32/bin/ld:
>  cannot find -lnbd: No such file or directory
> collect2: error: ld returned 1 exit status
> make[3]: *** [Makefile:3042: libpoke.la] Error 1
>
> The attached proposed patch fixes the issue. Basically, when pkg-config 
> reports
> that a package is present, we have to verify that it is really present.
>
> I have verified it with all 3 ABIs:
>   - In the 64-bit ABI, libpoke gets linked to libnbd:
>
>     $ ldd build-64/libpoke/.libs/libpoke.so | grep libnbd
>         libnbd.so.0 => /lib/x86_64-linux-gnu/libnbd.so.0 (0x00007f8df66cd000)
>
>   - In the 32-bit and x32 ABIs, libpoke is not linked to libnbd:
>
>     $ ldd build-32/libpoke/.libs/libpoke.so | grep libnbd
>     $ ldd build-x32/libpoke/.libs/libpoke.so | grep libnbd
>
> Bruno
>
>>From 154b54fb30fc03259d14db56bb2d1a0e87794b9b Mon Sep 17 00:00:00 2001
> From: Bruno Haible <bruno@clisp.org>
> Date: Sat, 10 Feb 2024 00:59:53 +0100
> Subject: [PATCH] build: Fix link error on bi-arch systems when libnbd is
>  installed for some ABIs.
>
> * configure.ac (libnbd_enabled, LIBNBD_CFLAGS, LIBNBD_LIBS): When pkg-config
> reported that libnbd is present, verify that it is really present.
> ---
>  configure.ac | 41 +++++++++++++++++++++++++++++++++--------
>  1 file changed, 33 insertions(+), 8 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index fedc7bd8..b66250e2 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -184,17 +184,42 @@ AC_ARG_ENABLE([libnbd],
>                AS_HELP_STRING([--enable-libnbd],
>                               [Enable building with NBD support (default is 
> YES)]),
>                [libnbd_enabled=$enableval], [libnbd_enabled=yes])
> +NBDKIT=no
>  if test "x$libnbd_enabled" = "xyes"; then
> -  PKG_CHECK_MODULES([LIBNBD], [libnbd], [
> -    AC_SUBST([LIBNBD_CFLAGS])
> -    AC_SUBST([LIBNBD_LIBS])
> -    AC_DEFINE([HAVE_LIBNBD], [1], [libnbd found at compile time])
> -    AC_PATH_PROGS([NBDKIT], [nbdkit], [no], 
> [$PATH:/usr/local/sbin:/usr/sbin])
> -  ], [libnbd_enabled=no NBDKIT=no])
> -else
> -  NBDKIT=no
> +  PKG_CHECK_MODULES([LIBNBD], [libnbd],
> +    [dnl Test whether libnbd is really present. This is needed for bi-arch
> +     dnl systems: libnbd may be installed only in 64-bit mode, and the
> +     dnl libnbd.pc file will then also be found in 32-bit mode, for which no
> +     dnl library is installed.
> +     saved_CFLAGS=$CFLAGS
> +     saved_LIBS=$LIBS
> +     CFLAGS="$CFLAGS $LIBNBD_CFLAGS"
> +     LIBS="$LIBS $LIBNBD_LIBS"
> +     AC_LINK_IFELSE(
> +       [AC_LANG_PROGRAM(
> +          [[#include <libnbd.h>]],
> +          [[return nbd_get_errno ();]])
> +       ],
> +       [dnl Yes it is present.
> +        AC_DEFINE([HAVE_LIBNBD], [1], [libnbd found at compile time])
> +        AC_PATH_PROGS([NBDKIT], [nbdkit], [no], 
> [$PATH:/usr/local/sbin:/usr/sbin])
> +       ],
> +       [dnl Nope, pkg-config fooled us.
> +        libnbd_enabled=no
> +        LIBNBD_CFLAGS=
> +        LIBNBD_LIBS=
> +       ])
> +     LIBS=$saved_LIBS
> +     CFLAGS=$saved_CFLAGS
> +    ],
> +    [libnbd_enabled=no
> +     LIBNBD_CFLAGS=
> +     LIBNBD_LIBS=
> +    ])
>  fi
>  AM_CONDITIONAL([NBD], [test "x$libnbd_enabled" = "xyes"])
> +AC_SUBST([LIBNBD_CFLAGS])
> +AC_SUBST([LIBNBD_LIBS])
>  
>  dnl Check for mmap
>  AC_FUNC_MMAP



reply via email to

[Prev in Thread] Current Thread [Next in Thread]