When building cargo-native on centos7 with buildtools tarball installed, we see failures:
/bin/sh: /lib64/libc.so.6: version `GLIBC_2.33' not found (required by /home/pokybuild/yocto-worker/reproducible-centos/build/build-st/tmp/work/x86_64-linux/cargo-native/1.54.0-r0/recipe-sysroot-native/usr/lib/libtinfo.so.5) The reason for this is that the wrapper script cargo-native/1.54.0-r0/wrapper/target-rust-ccld has /bin/sh as it's interpreter and cargo calls this with LD_LIBRARY_PATH set to include the recipe-sysroot-native. The host /bin/sh links to libtinfo from the host but it finds the version in the sysroot which needs a newer libc. This results in the above error since the loader is an older libc and the two are incompatible. Our ccld wrapper calls gcc/ld which don't need the LD_LIBRARY_PATH variable set. We can't patch this out the source since we're using a prebuilt binary to generate a new cargo binary so this is impossible to bootstrap. Instead, put a binary wrapper into place which removes LD_LIBRARY_PATH from the environment before calling the original wrapper (left in shell as it is simpler to maintain). Also add the interpreter relocation trick from uninative to the prebuilt cargo binary to match rust-native, just in case that causes other problems later too. Signed-off-by: Richard Purdie <richard.pur...@linuxfoundation.org> --- meta/recipes-devtools/cargo/cargo.inc | 12 ++++++++ .../cargo/files/ccld-wrapper.c | 29 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 meta/recipes-devtools/cargo/files/ccld-wrapper.c diff --git a/meta/recipes-devtools/cargo/cargo.inc b/meta/recipes-devtools/cargo/cargo.inc index 6161c327e81..a114266eac4 100644 --- a/meta/recipes-devtools/cargo/cargo.inc +++ b/meta/recipes-devtools/cargo/cargo.inc @@ -20,6 +20,11 @@ inherit cargo do_cargo_setup_snapshot () { ${WORKDIR}/rust-snapshot-components/${CARGO_SNAPSHOT}/install.sh --prefix="${WORKDIR}/${CARGO_SNAPSHOT}" --disable-ldconfig + # Need to use uninative's loader if enabled/present since the library paths + # are used internally by rust and result in symbol mismatches if we don't + if [ ! -z "${UNINATIVE_LOADER}" -a -e "${UNINATIVE_LOADER}" ]; then + patchelf-uninative ${WORKDIR}/${CARGO_SNAPSHOT}/bin/cargo --set-interpreter ${UNINATIVE_LOADER} + fi } addtask cargo_setup_snapshot after do_unpack before do_configure @@ -47,3 +52,10 @@ export LIBSSH2_SYS_USE_PKG_CONFIG = "1" # so we must use the locally set up snapshot to bootstrap the build. BASEDEPENDS:remove:class-native = "cargo-native" CARGO:class-native = "${WORKDIR}/${CARGO_SNAPSHOT}/bin/cargo" + +SRC_URI += "file://ccld-wrapper.c" + +do_rust_create_wrappers:append () { + mv ${RUST_TARGET_CCLD} ${RUST_TARGET_CCLD}.real + ${BUILD_CC} ${WORKDIR}/ccld-wrapper.c -o ${RUST_TARGET_CCLD} +} diff --git a/meta/recipes-devtools/cargo/files/ccld-wrapper.c b/meta/recipes-devtools/cargo/files/ccld-wrapper.c new file mode 100644 index 00000000000..6bc9958b907 --- /dev/null +++ b/meta/recipes-devtools/cargo/files/ccld-wrapper.c @@ -0,0 +1,29 @@ +/* + * Copyright 2021 Richard Purdie + * + * SPDX-License-Identifier: GPL-2.0-only + */ + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +/* + * Run the original script (argv[0] + ".real") with LD_LIBRARY_PATH unset + * This avoids issues where cargo is running a wrapper script using /bin/sh from the host + * which links to something which has an incompatible version in in recipe-sysroot-native + * such as libtinfo on centos 7. + */ + +int main(int argc, char* argv[]) { + char *real = malloc(strlen(argv[0] + 5)); + strcpy(real, argv[0]); + strcpy(real + strlen(argv[0]), ".real"); + putenv("LD_LIBRARY_PATH="); + if(execv(real, argv) == -1) { + printf("Wrapper failed to execute, error: %s\n", strerror(errno)); + return -1; + } +} -- 2.32.0
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#155559): https://lists.openembedded.org/g/openembedded-core/message/155559 Mute This Topic: https://lists.openembedded.org/mt/85302005/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-