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]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to