Steve, Please backport this to Langdale
On Fri, Oct 21, 2022 at 1:14 PM Joshua Watt <jpewhac...@gmail.com> wrote: > > The bridge helper program is invoked directly from QEMU when it needs to > attach to a network bridge. As such, it is subject to the environment of > QEMU itself. Specifically, if bridging is enabled with direct rendering > acceleration, QEMU is run with an LD_PRELOAD that attempts to preload > several uninative libraries; however /bin/sh doesn't use the uninative > loader which means it can fail to start with an error like: > > /bin/sh: symbol lookup error: > sysroots-uninative/x86_64-linux/lib/librt.so.1: undefined symbol: > __libc_unwind_link_get, version GLIBC_PRIVATE > > Converting the helper program to a C program resolves this problem > because it will now use the uninative loader so the preload doesn't > cause errors. > > Signed-off-by: Joshua Watt <jpewhac...@gmail.com> > --- > .../qemu/qemu-helper-native_1.0.bb | 6 +-- > .../qemu/qemu-helper/qemu-oe-bridge-helper | 25 ----------- > .../qemu/qemu-helper/qemu-oe-bridge-helper.c | 41 +++++++++++++++++++ > 3 files changed, 44 insertions(+), 28 deletions(-) > delete mode 100755 > meta/recipes-devtools/qemu/qemu-helper/qemu-oe-bridge-helper > create mode 100644 > meta/recipes-devtools/qemu/qemu-helper/qemu-oe-bridge-helper.c > > diff --git a/meta/recipes-devtools/qemu/qemu-helper-native_1.0.bb > b/meta/recipes-devtools/qemu/qemu-helper-native_1.0.bb > index aa9e499c77..e297586bbb 100644 > --- a/meta/recipes-devtools/qemu/qemu-helper-native_1.0.bb > +++ b/meta/recipes-devtools/qemu/qemu-helper-native_1.0.bb > @@ -7,7 +7,7 @@ LIC_FILES_CHKSUM = > "file://${WORKDIR}/tunctl.c;endline=4;md5=ff3a09996bc5fff6bc5 > > SRC_URI = "\ > file://tunctl.c \ > - file://qemu-oe-bridge-helper \ > + file://qemu-oe-bridge-helper.c \ > " > > S = "${WORKDIR}" > @@ -16,13 +16,13 @@ inherit native > > do_compile() { > ${CC} ${CFLAGS} ${LDFLAGS} -Wall tunctl.c -o tunctl > + ${CC} ${CFLAGS} ${LDFLAGS} -Wall qemu-oe-bridge-helper.c -o > qemu-oe-bridge-helper > } > > do_install() { > install -d ${D}${bindir} > install tunctl ${D}${bindir}/ > - > - install -m 755 ${WORKDIR}/qemu-oe-bridge-helper ${D}${bindir}/ > + install qemu-oe-bridge-helper ${D}${bindir}/ > } > > DEPENDS += "qemu-system-native" > diff --git a/meta/recipes-devtools/qemu/qemu-helper/qemu-oe-bridge-helper > b/meta/recipes-devtools/qemu/qemu-helper/qemu-oe-bridge-helper > deleted file mode 100755 > index f057d4eef0..0000000000 > --- a/meta/recipes-devtools/qemu/qemu-helper/qemu-oe-bridge-helper > +++ /dev/null > @@ -1,25 +0,0 @@ > -#! /bin/sh > -# Copyright 2020 Garmin Ltd. or its subsidiaries > -# > -# SPDX-License-Identifier: GPL-2.0 > -# > -# Attempts to find and exec the host qemu-bridge-helper program > - > -# If the QEMU_BRIDGE_HELPER variable is set by the user, exec it. > -if [ -n "$QEMU_BRIDGE_HELPER" ]; then > - exec "$QEMU_BRIDGE_HELPER" "$@" > -fi > - > -# Search common paths for the helper program > -BN="qemu-bridge-helper" > -PATHS="/usr/libexec/ /usr/lib/qemu/" > - > -for p in $PATHS; do > - if [ -e "$p/$BN" ]; then > - exec "$p/$BN" "$@" > - fi > -done > - > -echo "$BN not found!" > /dev/stderr > -exit 1 > - > diff --git a/meta/recipes-devtools/qemu/qemu-helper/qemu-oe-bridge-helper.c > b/meta/recipes-devtools/qemu/qemu-helper/qemu-oe-bridge-helper.c > new file mode 100644 > index 0000000000..cadf2a012a > --- /dev/null > +++ b/meta/recipes-devtools/qemu/qemu-helper/qemu-oe-bridge-helper.c > @@ -0,0 +1,41 @@ > +/* > + * Copyright 2022 Garmin Ltd. or its subsidiaries > + * > + * SPDX-License-Identifier: GPL-2.0 > + * > + * Attempts to find and exec the host qemu-bridge-helper program > + */ > + > +#include <stdio.h> > +#include <unistd.h> > + > +void try_program(char const* path, char** args) { > + if (access(path, X_OK) == 0) { > + execv(path, args); > + } > +} > + > +int main(int argc, char** argv) { > + char* var; > + > + /* Copy arguments so that they are a NULL terminated list, skipping > argv[0] > + * since it is this program name */ > + char** args = malloc(argc * sizeof(char*)); > + for (int i = 0; i < argc - 1; i++) { > + args[i] = argv[i + 1]; > + } > + args[argc - 1] = NULL; > + > + var = getenv("QEMU_BRIDGE_HELPER"); > + if (var && var[0] != '\0') { > + execvp(var, args); > + return 1; > + } > + > + try_program("/usr/libexec/qemu-bridge-helper", args); > + try_program("/usr/lib/qemu/qemu-bridge-helper", args); > + > + fprintf(stderr, "No bridge helper found\n"); > + return 1; > +} > + > -- > 2.33.0 >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#173656): https://lists.openembedded.org/g/openembedded-core/message/173656 Mute This Topic: https://lists.openembedded.org/mt/94481890/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-