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]

(From OE-Core rev: 7cd6faf4e0147eef557f83fb266a25935e26efff)

Signed-off-by: Sundeep KOKKONDA <sundeep.kokkonda@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Sundeep KOKKONDA
2022-09-07 07:48:17 +05:30
committed by Richard Purdie
parent 1e2b9bafd4
commit dd8fd17a1b
2 changed files with 36 additions and 3 deletions

View File

@@ -0,0 +1,19 @@
/*
*
* Copyright (C) 2022 Wind River Systems
*
* SPDX-License-Identifier: MIT
*
*/
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main (int argc, char *argv[])
{
unsetenv("LD_LIBRARY_PATH");
execvp("target-rust-ccld-wrapper", argv);
return 0;
}

View File

@@ -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}"