From 7cd6faf4e0147eef557f83fb266a25935e26efff Mon Sep 17 00:00:00 2001 From: Sundeep KOKKONDA Date: Wed, 7 Sep 2022 07:48:17 +0530 Subject: [PATCH] rust-cross-canadian: Fix for the issue caused by using sdk shell This is a fix for the fix in YOCTO #14878. When the shebang is more than 128 characters the default shell /bin/sh is used instead of SDK shell as a fallback, which causes problems with LD_LIBRARY_PATH. With this patch shell usage is avoided as we use a C wrapper and unset LD_LIBRARY_PATH that way. [YOCTO #14892] Signed-off-by: Sundeep KOKKONDA Signed-off-by: Richard Purdie --- .../rust/files/target-rust-ccld.c | 19 ++++++++++++++++++ .../rust/rust-cross-canadian.inc | 20 ++++++++++++++++--- 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 meta/recipes-devtools/rust/files/target-rust-ccld.c diff --git a/meta/recipes-devtools/rust/files/target-rust-ccld.c b/meta/recipes-devtools/rust/files/target-rust-ccld.c new file mode 100644 index 00000000000..d3d491fb60f --- /dev/null +++ b/meta/recipes-devtools/rust/files/target-rust-ccld.c @@ -0,0 +1,19 @@ +/* +* +* Copyright (C) 2022 Wind River Systems +* +* SPDX-License-Identifier: MIT +* +*/ + +#include +#include +#include + +int main (int argc, char *argv[]) +{ + unsetenv("LD_LIBRARY_PATH"); + execvp("target-rust-ccld-wrapper", argv); + + return 0; +} diff --git a/meta/recipes-devtools/rust/rust-cross-canadian.inc b/meta/recipes-devtools/rust/rust-cross-canadian.inc index 7bf75a4712e..17f933959f5 100644 --- a/meta/recipes-devtools/rust/rust-cross-canadian.inc +++ b/meta/recipes-devtools/rust/rust-cross-canadian.inc @@ -7,13 +7,18 @@ LICENSE = "MIT" MODIFYTOS = "0" +DEPENDS += "virtual/${SDK_PREFIX}gcc-crosssdk virtual/nativesdk-libc virtual/nativesdk-${SDK_PREFIX}compilerlibs" + +SRC_URI += "file://target-rust-ccld.c" +LIC_FILES_CHKSUM = "file://target-rust-ccld.c;md5=af4e0e29f81a34cffe05aa07c89e93e9;endline=7" +S = "${WORKDIR}" + # Need to use our SDK's sh here, see #14878 create_sdk_wrapper () { file="$1" shift - cat <<- EOF > "${file}" - #!${base_prefix}/bin/sh + #!/bin/sh \$$1 \$@ EOF @@ -32,8 +37,17 @@ do_install () { install -m 0644 "${RUST_TARGETS_DIR}/${RUST_TARGET_SYS}.json" "${RUSTLIB_DIR}" # Uses SDK's CC as linker so linked binaries works out of box. + # We have a problem as rust sets LD_LIBRARY_PATH and this will break running host + # binaries (even /bin/sh) in the SDK as they detect a newer glibc from the SDK + # in those paths and we hit symbol errors. We saw particular problems with symbol + # mismatch on ubuntu1804 during development. To avoid this we have an SDK built + # binary which unsets LD_LIBRARY_PATH, which can then call the wrapper script + # where the context is easier to do the env maniupations needed install -d ${SYS_BINDIR} - create_sdk_wrapper "${SYS_BINDIR}/target-rust-ccld" "CC" + outfile="${SYS_BINDIR}/target-rust-ccld" + ${CC} ${WORKDIR}/target-rust-ccld.c -o $outfile + chmod +x "$outfile" + create_sdk_wrapper "${SYS_BINDIR}/target-rust-ccld-wrapper" "CC" ENV_SETUP_DIR=${D}${base_prefix}/environment-setup.d mkdir "${ENV_SETUP_DIR}" -- 2.47.3