[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