runqemu: preload uninative libraries when host gl drivers are in use

Message ID 20220204204027.2323845-1-alex@linutronix.de
State Accepted, archived
Commit 39c10816d5ec9d9c7952d786d7a3f942d25d0c27
Headers show
Series runqemu: preload uninative libraries when host gl drivers are in use | expand

Commit Message

Alexander Kanavin Feb. 4, 2022, 8:40 p.m. UTC
Some of the host distributions build the drivers in a way (RPATH/RUNPATH)
that tricks uninative loader into loading pieces of the host libc, if
the same pieces haven't been previously loaded by native binaries. Mixing
the two libc versions leads to failures.

This change ensures that the correct (uninative) versions are always in use.

Signed-off-by: Alexander Kanavin <alex@linutronix.de>
---
 meta/classes/qemuboot.bbclass | 2 +-
 scripts/runqemu               | 4 ++++
 2 files changed, 5 insertions(+), 1 deletion(-)

Comments

Christopher Larson Feb. 4, 2022, 9:17 p.m. UTC | #1
What will this do if uninative isn't enabled?

On Fri, Feb 4, 2022 at 1:40 PM Alexander Kanavin <alex.kanavin@gmail.com>
wrote:

> Some of the host distributions build the drivers in a way (RPATH/RUNPATH)
> that tricks uninative loader into loading pieces of the host libc, if
> the same pieces haven't been previously loaded by native binaries. Mixing
> the two libc versions leads to failures.
>
> This change ensures that the correct (uninative) versions are always in
> use.
>
> Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> ---
>  meta/classes/qemuboot.bbclass | 2 +-
>  scripts/runqemu               | 4 ++++
>  2 files changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/meta/classes/qemuboot.bbclass b/meta/classes/qemuboot.bbclass
> index cc1cbce69d..229bd88527 100644
> --- a/meta/classes/qemuboot.bbclass
> +++ b/meta/classes/qemuboot.bbclass
> @@ -109,7 +109,7 @@ def qemuboot_vars(d):
>      build_vars = ['MACHINE', 'TUNE_ARCH', 'DEPLOY_DIR_IMAGE',
>                  'KERNEL_IMAGETYPE', 'IMAGE_NAME', 'IMAGE_LINK_NAME',
>                  'STAGING_DIR_NATIVE', 'STAGING_BINDIR_NATIVE',
> -                'STAGING_DIR_HOST', 'SERIAL_CONSOLES']
> +                'STAGING_DIR_HOST', 'SERIAL_CONSOLES', 'UNINATIVE_LOADER']
>      return build_vars + [k for k in d.keys() if k.startswith('QB_')]
>
>  do_write_qemuboot_conf[vardeps] += "${@' '.join(qemuboot_vars(d))}"
> diff --git a/scripts/runqemu b/scripts/runqemu
> index 4e05c1bb15..7d1f85f357 100755
> --- a/scripts/runqemu
> +++ b/scripts/runqemu
> @@ -460,6 +460,10 @@ class BaseConfig(object):
>          except subprocess.CalledProcessError as e:
>              raise RunQemuError("Could not determine the path to dri
> drivers on the host via pkg-config.\nPlease install Mesa development files
> (particularly, dri.pc) on the host machine.")
>          os.environ['LIBGL_DRIVERS_PATH'] = dripath.decode('utf-8').strip()
> +        uninative_path = os.path.dirname(self.get("UNINATIVE_LOADER"))
> +        preload_items = ['libdl.so.2', 'librt.so.1', 'libpthread.so.0']
> +        preload_paths = [os.path.join(uninative_path, i) for i in
> preload_items]
> +        os.environ['LD_PRELOAD'] = " ".join(preload_paths)
>
>      def check_args(self):
>          for debug in ("-d", "--debug"):
> --
> 2.20.1
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#161382):
> https://lists.openembedded.org/g/openembedded-core/message/161382
> Mute This Topic: https://lists.openembedded.org/mt/88916306/3617123
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [
> kergoth@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
Alexander Kanavin Feb. 4, 2022, 9:30 p.m. UTC | #2
The dynamic loader will print an error about missing libraries, but will
execute the binary regardless.

Alex

On Fri, 4 Feb 2022 at 22:17, Christopher Larson <kergoth@gmail.com> wrote:

> What will this do if uninative isn't enabled?
>
> On Fri, Feb 4, 2022 at 1:40 PM Alexander Kanavin <alex.kanavin@gmail.com>
> wrote:
>
>> Some of the host distributions build the drivers in a way (RPATH/RUNPATH)
>> that tricks uninative loader into loading pieces of the host libc, if
>> the same pieces haven't been previously loaded by native binaries. Mixing
>> the two libc versions leads to failures.
>>
>> This change ensures that the correct (uninative) versions are always in
>> use.
>>
>> Signed-off-by: Alexander Kanavin <alex@linutronix.de>
>> ---
>>  meta/classes/qemuboot.bbclass | 2 +-
>>  scripts/runqemu               | 4 ++++
>>  2 files changed, 5 insertions(+), 1 deletion(-)
>>
>> diff --git a/meta/classes/qemuboot.bbclass b/meta/classes/qemuboot.bbclass
>> index cc1cbce69d..229bd88527 100644
>> --- a/meta/classes/qemuboot.bbclass
>> +++ b/meta/classes/qemuboot.bbclass
>> @@ -109,7 +109,7 @@ def qemuboot_vars(d):
>>      build_vars = ['MACHINE', 'TUNE_ARCH', 'DEPLOY_DIR_IMAGE',
>>                  'KERNEL_IMAGETYPE', 'IMAGE_NAME', 'IMAGE_LINK_NAME',
>>                  'STAGING_DIR_NATIVE', 'STAGING_BINDIR_NATIVE',
>> -                'STAGING_DIR_HOST', 'SERIAL_CONSOLES']
>> +                'STAGING_DIR_HOST', 'SERIAL_CONSOLES',
>> 'UNINATIVE_LOADER']
>>      return build_vars + [k for k in d.keys() if k.startswith('QB_')]
>>
>>  do_write_qemuboot_conf[vardeps] += "${@' '.join(qemuboot_vars(d))}"
>> diff --git a/scripts/runqemu b/scripts/runqemu
>> index 4e05c1bb15..7d1f85f357 100755
>> --- a/scripts/runqemu
>> +++ b/scripts/runqemu
>> @@ -460,6 +460,10 @@ class BaseConfig(object):
>>          except subprocess.CalledProcessError as e:
>>              raise RunQemuError("Could not determine the path to dri
>> drivers on the host via pkg-config.\nPlease install Mesa development files
>> (particularly, dri.pc) on the host machine.")
>>          os.environ['LIBGL_DRIVERS_PATH'] =
>> dripath.decode('utf-8').strip()
>> +        uninative_path = os.path.dirname(self.get("UNINATIVE_LOADER"))
>> +        preload_items = ['libdl.so.2', 'librt.so.1', 'libpthread.so.0']
>> +        preload_paths = [os.path.join(uninative_path, i) for i in
>> preload_items]
>> +        os.environ['LD_PRELOAD'] = " ".join(preload_paths)
>>
>>      def check_args(self):
>>          for debug in ("-d", "--debug"):
>> --
>> 2.20.1
>>
>>
>> -=-=-=-=-=-=-=-=-=-=-=-
>> Links: You receive all messages sent to this group.
>> View/Reply Online (#161382):
>> https://lists.openembedded.org/g/openembedded-core/message/161382
>> Mute This Topic: https://lists.openembedded.org/mt/88916306/3617123
>> Group Owner: openembedded-core+owner@lists.openembedded.org
>> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [
>> kergoth@gmail.com]
>> -=-=-=-=-=-=-=-=-=-=-=-
>>
>>
>
> --
> Christopher Larson
> kergoth at gmail dot com
> Founder - BitBake, OpenEmbedded, OpenZaurus
> Senior Software Engineer, Mentor Graphics
>
Richard Purdie Feb. 5, 2022, 12:20 p.m. UTC | #3
On Fri, 2022-02-04 at 21:40 +0100, Alexander Kanavin wrote:
> Some of the host distributions build the drivers in a way (RPATH/RUNPATH)
> that tricks uninative loader into loading pieces of the host libc, if
> the same pieces haven't been previously loaded by native binaries. Mixing
> the two libc versions leads to failures.
> 
> This change ensures that the correct (uninative) versions are always in use.
> 
> Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> ---
>  meta/classes/qemuboot.bbclass | 2 +-
>  scripts/runqemu               | 4 ++++
>  2 files changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/meta/classes/qemuboot.bbclass b/meta/classes/qemuboot.bbclass
> index cc1cbce69d..229bd88527 100644
> --- a/meta/classes/qemuboot.bbclass
> +++ b/meta/classes/qemuboot.bbclass
> @@ -109,7 +109,7 @@ def qemuboot_vars(d):
>      build_vars = ['MACHINE', 'TUNE_ARCH', 'DEPLOY_DIR_IMAGE',
>                  'KERNEL_IMAGETYPE', 'IMAGE_NAME', 'IMAGE_LINK_NAME',
>                  'STAGING_DIR_NATIVE', 'STAGING_BINDIR_NATIVE',
> -                'STAGING_DIR_HOST', 'SERIAL_CONSOLES']
> +                'STAGING_DIR_HOST', 'SERIAL_CONSOLES', 'UNINATIVE_LOADER']
>      return build_vars + [k for k in d.keys() if k.startswith('QB_')]
>  
>  do_write_qemuboot_conf[vardeps] += "${@' '.join(qemuboot_vars(d))}"
> diff --git a/scripts/runqemu b/scripts/runqemu
> index 4e05c1bb15..7d1f85f357 100755
> --- a/scripts/runqemu
> +++ b/scripts/runqemu
> @@ -460,6 +460,10 @@ class BaseConfig(object):
>          except subprocess.CalledProcessError as e:
>              raise RunQemuError("Could not determine the path to dri drivers on the host via pkg-config.\nPlease install Mesa development files (particularly, dri.pc) on the host machine.")
>          os.environ['LIBGL_DRIVERS_PATH'] = dripath.decode('utf-8').strip()
> +        uninative_path = os.path.dirname(self.get("UNINATIVE_LOADER"))
> +        preload_items = ['libdl.so.2', 'librt.so.1', 'libpthread.so.0']
> +        preload_paths = [os.path.join(uninative_path, i) for i in preload_items]
> +        os.environ['LD_PRELOAD'] = " ".join(preload_paths)
>  

This looks like a good way to work around this corner case and I don't see any
other alternative. Can I ask that:

a) we put some comment into the code so we can understand this in a couple of
years time as it is a rather weird corner case

b) we put some "if os.path.exists()" in there, maybe even just on the uninnative
loader direction so that in the non-uninative case we don't throw warnings?

Cheers,

Richard
Richard Purdie Feb. 6, 2022, 9:51 a.m. UTC | #4
On Sat, 2022-02-05 at 12:20 +0000, Richard Purdie via lists.openembedded.org
wrote:
> On Fri, 2022-02-04 at 21:40 +0100, Alexander Kanavin wrote:
> > Some of the host distributions build the drivers in a way (RPATH/RUNPATH)
> > that tricks uninative loader into loading pieces of the host libc, if
> > the same pieces haven't been previously loaded by native binaries. Mixing
> > the two libc versions leads to failures.
> > 
> > This change ensures that the correct (uninative) versions are always in use.
> > 
> > Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> > ---
> >  meta/classes/qemuboot.bbclass | 2 +-
> >  scripts/runqemu               | 4 ++++
> >  2 files changed, 5 insertions(+), 1 deletion(-)
> > 
> > diff --git a/meta/classes/qemuboot.bbclass b/meta/classes/qemuboot.bbclass
> > index cc1cbce69d..229bd88527 100644
> > --- a/meta/classes/qemuboot.bbclass
> > +++ b/meta/classes/qemuboot.bbclass
> > @@ -109,7 +109,7 @@ def qemuboot_vars(d):
> >      build_vars = ['MACHINE', 'TUNE_ARCH', 'DEPLOY_DIR_IMAGE',
> >                  'KERNEL_IMAGETYPE', 'IMAGE_NAME', 'IMAGE_LINK_NAME',
> >                  'STAGING_DIR_NATIVE', 'STAGING_BINDIR_NATIVE',
> > -                'STAGING_DIR_HOST', 'SERIAL_CONSOLES']
> > +                'STAGING_DIR_HOST', 'SERIAL_CONSOLES', 'UNINATIVE_LOADER']
> >      return build_vars + [k for k in d.keys() if k.startswith('QB_')]
> >  
> >  do_write_qemuboot_conf[vardeps] += "${@' '.join(qemuboot_vars(d))}"
> > diff --git a/scripts/runqemu b/scripts/runqemu
> > index 4e05c1bb15..7d1f85f357 100755
> > --- a/scripts/runqemu
> > +++ b/scripts/runqemu
> > @@ -460,6 +460,10 @@ class BaseConfig(object):
> >          except subprocess.CalledProcessError as e:
> >              raise RunQemuError("Could not determine the path to dri drivers on the host via pkg-config.\nPlease install Mesa development files (particularly, dri.pc) on the host machine.")
> >          os.environ['LIBGL_DRIVERS_PATH'] = dripath.decode('utf-8').strip()
> > +        uninative_path = os.path.dirname(self.get("UNINATIVE_LOADER"))
> > +        preload_items = ['libdl.so.2', 'librt.so.1', 'libpthread.so.0']
> > +        preload_paths = [os.path.join(uninative_path, i) for i in preload_items]
> > +        os.environ['LD_PRELOAD'] = " ".join(preload_paths)
> >  
> 
> This looks like a good way to work around this corner case and I don't see any
> other alternative. Can I ask that:
> 
> a) we put some comment into the code so we can understand this in a couple of
> years time as it is a rather weird corner case
> 
> b) we put some "if os.path.exists()" in there, maybe even just on the uninnative
> loader direction so that in the non-uninative case we don't throw warnings?

I've added a tweak doing this into master-next.

Cheers,

Richard
Richard Purdie Feb. 6, 2022, 9:57 a.m. UTC | #5
On Sun, 2022-02-06 at 09:51 +0000, Richard Purdie via lists.openembedded.org
wrote:
> On Sat, 2022-02-05 at 12:20 +0000, Richard Purdie via lists.openembedded.org
> wrote:
> > On Fri, 2022-02-04 at 21:40 +0100, Alexander Kanavin wrote:
> > > Some of the host distributions build the drivers in a way (RPATH/RUNPATH)
> > > that tricks uninative loader into loading pieces of the host libc, if
> > > the same pieces haven't been previously loaded by native binaries. Mixing
> > > the two libc versions leads to failures.
> > > 
> > > This change ensures that the correct (uninative) versions are always in use.
> > > 
> > > Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> > > ---
> > >  meta/classes/qemuboot.bbclass | 2 +-
> > >  scripts/runqemu               | 4 ++++
> > >  2 files changed, 5 insertions(+), 1 deletion(-)
> > > 
> > > diff --git a/meta/classes/qemuboot.bbclass b/meta/classes/qemuboot.bbclass
> > > index cc1cbce69d..229bd88527 100644
> > > --- a/meta/classes/qemuboot.bbclass
> > > +++ b/meta/classes/qemuboot.bbclass
> > > @@ -109,7 +109,7 @@ def qemuboot_vars(d):
> > >      build_vars = ['MACHINE', 'TUNE_ARCH', 'DEPLOY_DIR_IMAGE',
> > >                  'KERNEL_IMAGETYPE', 'IMAGE_NAME', 'IMAGE_LINK_NAME',
> > >                  'STAGING_DIR_NATIVE', 'STAGING_BINDIR_NATIVE',
> > > -                'STAGING_DIR_HOST', 'SERIAL_CONSOLES']
> > > +                'STAGING_DIR_HOST', 'SERIAL_CONSOLES', 'UNINATIVE_LOADER']
> > >      return build_vars + [k for k in d.keys() if k.startswith('QB_')]
> > >  
> > >  do_write_qemuboot_conf[vardeps] += "${@' '.join(qemuboot_vars(d))}"
> > > diff --git a/scripts/runqemu b/scripts/runqemu
> > > index 4e05c1bb15..7d1f85f357 100755
> > > --- a/scripts/runqemu
> > > +++ b/scripts/runqemu
> > > @@ -460,6 +460,10 @@ class BaseConfig(object):
> > >          except subprocess.CalledProcessError as e:
> > >              raise RunQemuError("Could not determine the path to dri drivers on the host via pkg-config.\nPlease install Mesa development files (particularly, dri.pc) on the host machine.")
> > >          os.environ['LIBGL_DRIVERS_PATH'] = dripath.decode('utf-8').strip()
> > > +        uninative_path = os.path.dirname(self.get("UNINATIVE_LOADER"))
> > > +        preload_items = ['libdl.so.2', 'librt.so.1', 'libpthread.so.0']
> > > +        preload_paths = [os.path.join(uninative_path, i) for i in preload_items]
> > > +        os.environ['LD_PRELOAD'] = " ".join(preload_paths)
> > >  
> > 
> > This looks like a good way to work around this corner case and I don't see any
> > other alternative. Can I ask that:
> > 
> > a) we put some comment into the code so we can understand this in a couple of
> > years time as it is a rather weird corner case
> > 
> > b) we put some "if os.path.exists()" in there, maybe even just on the uninnative
> > loader direction so that in the non-uninative case we don't throw warnings?
> 
> I've added a tweak doing this into master-next.

Although I see one in your branch too, should have checked that first :/

Cheers,

Richard
Alexander Kanavin Feb. 6, 2022, 10:13 a.m. UTC | #6
There's also an issue with the wrapper script run by host bash for
qemu-system that breaks with uninative, so just hold it off until I get it
all confirmed as working :)

Alex

On Sun, 6 Feb 2022 at 10:57, Richard Purdie <
richard.purdie@linuxfoundation.org> wrote:

> On Sun, 2022-02-06 at 09:51 +0000, Richard Purdie via
> lists.openembedded.org
> wrote:
> > On Sat, 2022-02-05 at 12:20 +0000, Richard Purdie via
> lists.openembedded.org
> > wrote:
> > > On Fri, 2022-02-04 at 21:40 +0100, Alexander Kanavin wrote:
> > > > Some of the host distributions build the drivers in a way
> (RPATH/RUNPATH)
> > > > that tricks uninative loader into loading pieces of the host libc, if
> > > > the same pieces haven't been previously loaded by native binaries.
> Mixing
> > > > the two libc versions leads to failures.
> > > >
> > > > This change ensures that the correct (uninative) versions are always
> in use.
> > > >
> > > > Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> > > > ---
> > > >  meta/classes/qemuboot.bbclass | 2 +-
> > > >  scripts/runqemu               | 4 ++++
> > > >  2 files changed, 5 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/meta/classes/qemuboot.bbclass
> b/meta/classes/qemuboot.bbclass
> > > > index cc1cbce69d..229bd88527 100644
> > > > --- a/meta/classes/qemuboot.bbclass
> > > > +++ b/meta/classes/qemuboot.bbclass
> > > > @@ -109,7 +109,7 @@ def qemuboot_vars(d):
> > > >      build_vars = ['MACHINE', 'TUNE_ARCH', 'DEPLOY_DIR_IMAGE',
> > > >                  'KERNEL_IMAGETYPE', 'IMAGE_NAME', 'IMAGE_LINK_NAME',
> > > >                  'STAGING_DIR_NATIVE', 'STAGING_BINDIR_NATIVE',
> > > > -                'STAGING_DIR_HOST', 'SERIAL_CONSOLES']
> > > > +                'STAGING_DIR_HOST', 'SERIAL_CONSOLES',
> 'UNINATIVE_LOADER']
> > > >      return build_vars + [k for k in d.keys() if k.startswith('QB_')]
> > > >
> > > >  do_write_qemuboot_conf[vardeps] += "${@' '.join(qemuboot_vars(d))}"
> > > > diff --git a/scripts/runqemu b/scripts/runqemu
> > > > index 4e05c1bb15..7d1f85f357 100755
> > > > --- a/scripts/runqemu
> > > > +++ b/scripts/runqemu
> > > > @@ -460,6 +460,10 @@ class BaseConfig(object):
> > > >          except subprocess.CalledProcessError as e:
> > > >              raise RunQemuError("Could not determine the path to dri
> drivers on the host via pkg-config.\nPlease install Mesa development files
> (particularly, dri.pc) on the host machine.")
> > > >          os.environ['LIBGL_DRIVERS_PATH'] =
> dripath.decode('utf-8').strip()
> > > > +        uninative_path =
> os.path.dirname(self.get("UNINATIVE_LOADER"))
> > > > +        preload_items = ['libdl.so.2', 'librt.so.1',
> 'libpthread.so.0']
> > > > +        preload_paths = [os.path.join(uninative_path, i) for i in
> preload_items]
> > > > +        os.environ['LD_PRELOAD'] = " ".join(preload_paths)
> > > >
> > >
> > > This looks like a good way to work around this corner case and I don't
> see any
> > > other alternative. Can I ask that:
> > >
> > > a) we put some comment into the code so we can understand this in a
> couple of
> > > years time as it is a rather weird corner case
> > >
> > > b) we put some "if os.path.exists()" in there, maybe even just on the
> uninnative
> > > loader direction so that in the non-uninative case we don't throw
> warnings?
> >
> > I've added a tweak doing this into master-next.
>
> Although I see one in your branch too, should have checked that first :/
>
> Cheers,
>
> Richard
>
>
Enrico Scholz Feb. 12, 2022, 1:18 p.m. UTC | #7
"Alexander Kanavin" <alex.kanavin@gmail.com> writes:

> --- a/meta/classes/qemuboot.bbclass
> +++ b/meta/classes/qemuboot.bbclass
> @@ -109,7 +109,7 @@ def qemuboot_vars(d):
>      build_vars = ['MACHINE', 'TUNE_ARCH', 'DEPLOY_DIR_IMAGE',
>                  'KERNEL_IMAGETYPE', 'IMAGE_NAME', 'IMAGE_LINK_NAME',
>                  'STAGING_DIR_NATIVE', 'STAGING_BINDIR_NATIVE',
> -                'STAGING_DIR_HOST', 'SERIAL_CONSOLES']
> +                'STAGING_DIR_HOST', 'SERIAL_CONSOLES', 'UNINATIVE_LOADER']
>      return build_vars + [k for k in d.keys() if k.startswith('QB_')]

Build without uninative fails now with

| File: '.../meta/classes/qemuboot.bbclass', lineno: 141, function: do_write_qemuboot_conf
|      0137:        else:
|      0138:            val = d.getVar(k)
|      0139:        # we only want to write out relative paths so that we can relocate images
|      0140:        # and still run them
|  *** 0141:        if val.startswith(topdir):
|      0142:            val = os.path.relpath(val, finalpath)
|      0143:        cf.set('config_bsp', k, '%s' % val)
|      0144:
|      0145:    # QB_DEFAULT_KERNEL's value of KERNEL_IMAGETYPE is the name of a symlink
| Exception: AttributeError: 'NoneType' object has no attribute 'startswith'



Enrico
Alexander Kanavin Feb. 12, 2022, 1:22 p.m. UTC | #8
On Sat, 12 Feb 2022 at 14:18, Enrico Scholz
<enrico.scholz@sigma-chemnitz.de> wrote:
> | File: '.../meta/classes/qemuboot.bbclass', lineno: 141, function: do_write_qemuboot_conf
> |      0137:        else:
> |      0138:            val = d.getVar(k)
> |      0139:        # we only want to write out relative paths so that we can relocate images
> |      0140:        # and still run them
> |  *** 0141:        if val.startswith(topdir):
> |      0142:            val = os.path.relpath(val, finalpath)
> |      0143:        cf.set('config_bsp', k, '%s' % val)
> |      0144:
> |      0145:    # QB_DEFAULT_KERNEL's value of KERNEL_IMAGETYPE is the name of a symlink
> | Exception: AttributeError: 'NoneType' object has no attribute 'startswith'

Fix is in master-next.

Alex
Joshua Watt Oct. 21, 2022, 3:27 p.m. UTC | #9
This patch broke runqemu for me when I moved to kirkstone. I get this error:

 /bin/sh: symbol lookup error:
/grmn/prj/mrn/alchemy/build/tmp/eng/kirkstone/tetra/sysroots-uninative/x86_64-linux/lib/librt.so.1:
undefined symbol: __libc_unwind_link_get, version GLIBC_PRIVATE

And I'm not sure how to fix it. Reverting this change does resolve the problem.

My host is Ubuntu 20.04



On Fri, Feb 4, 2022 at 2:40 PM Alexander Kanavin <alex.kanavin@gmail.com> wrote:
>
> Some of the host distributions build the drivers in a way (RPATH/RUNPATH)
> that tricks uninative loader into loading pieces of the host libc, if
> the same pieces haven't been previously loaded by native binaries. Mixing
> the two libc versions leads to failures.
>
> This change ensures that the correct (uninative) versions are always in use.
>
> Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> ---
>  meta/classes/qemuboot.bbclass | 2 +-
>  scripts/runqemu               | 4 ++++
>  2 files changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/meta/classes/qemuboot.bbclass b/meta/classes/qemuboot.bbclass
> index cc1cbce69d..229bd88527 100644
> --- a/meta/classes/qemuboot.bbclass
> +++ b/meta/classes/qemuboot.bbclass
> @@ -109,7 +109,7 @@ def qemuboot_vars(d):
>      build_vars = ['MACHINE', 'TUNE_ARCH', 'DEPLOY_DIR_IMAGE',
>                  'KERNEL_IMAGETYPE', 'IMAGE_NAME', 'IMAGE_LINK_NAME',
>                  'STAGING_DIR_NATIVE', 'STAGING_BINDIR_NATIVE',
> -                'STAGING_DIR_HOST', 'SERIAL_CONSOLES']
> +                'STAGING_DIR_HOST', 'SERIAL_CONSOLES', 'UNINATIVE_LOADER']
>      return build_vars + [k for k in d.keys() if k.startswith('QB_')]
>
>  do_write_qemuboot_conf[vardeps] += "${@' '.join(qemuboot_vars(d))}"
> diff --git a/scripts/runqemu b/scripts/runqemu
> index 4e05c1bb15..7d1f85f357 100755
> --- a/scripts/runqemu
> +++ b/scripts/runqemu
> @@ -460,6 +460,10 @@ class BaseConfig(object):
>          except subprocess.CalledProcessError as e:
>              raise RunQemuError("Could not determine the path to dri drivers on the host via pkg-config.\nPlease install Mesa development files (particularly, dri.pc) on the host machine.")
>          os.environ['LIBGL_DRIVERS_PATH'] = dripath.decode('utf-8').strip()
> +        uninative_path = os.path.dirname(self.get("UNINATIVE_LOADER"))
> +        preload_items = ['libdl.so.2', 'librt.so.1', 'libpthread.so.0']
> +        preload_paths = [os.path.join(uninative_path, i) for i in preload_items]
> +        os.environ['LD_PRELOAD'] = " ".join(preload_paths)
>
>      def check_args(self):
>          for debug in ("-d", "--debug"):
> --
> 2.20.1
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#161382): https://lists.openembedded.org/g/openembedded-core/message/161382
> Mute This Topic: https://lists.openembedded.org/mt/88916306/3616693
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [JPEWhacker@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Alexander Kanavin Oct. 21, 2022, 3:43 p.m. UTC | #10
This is the first time I hear about this - can you find out what is
expecting the symbol, and where it's supposed to come from?

Alex

On Fri, 21 Oct 2022 at 17:27, Joshua Watt <jpewhacker@gmail.com> wrote:
>
> This patch broke runqemu for me when I moved to kirkstone. I get this error:
>
>  /bin/sh: symbol lookup error:
> /grmn/prj/mrn/alchemy/build/tmp/eng/kirkstone/tetra/sysroots-uninative/x86_64-linux/lib/librt.so.1:
> undefined symbol: __libc_unwind_link_get, version GLIBC_PRIVATE
>
> And I'm not sure how to fix it. Reverting this change does resolve the problem.
>
> My host is Ubuntu 20.04
>
>
>
> On Fri, Feb 4, 2022 at 2:40 PM Alexander Kanavin <alex.kanavin@gmail.com> wrote:
> >
> > Some of the host distributions build the drivers in a way (RPATH/RUNPATH)
> > that tricks uninative loader into loading pieces of the host libc, if
> > the same pieces haven't been previously loaded by native binaries. Mixing
> > the two libc versions leads to failures.
> >
> > This change ensures that the correct (uninative) versions are always in use.
> >
> > Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> > ---
> >  meta/classes/qemuboot.bbclass | 2 +-
> >  scripts/runqemu               | 4 ++++
> >  2 files changed, 5 insertions(+), 1 deletion(-)
> >
> > diff --git a/meta/classes/qemuboot.bbclass b/meta/classes/qemuboot.bbclass
> > index cc1cbce69d..229bd88527 100644
> > --- a/meta/classes/qemuboot.bbclass
> > +++ b/meta/classes/qemuboot.bbclass
> > @@ -109,7 +109,7 @@ def qemuboot_vars(d):
> >      build_vars = ['MACHINE', 'TUNE_ARCH', 'DEPLOY_DIR_IMAGE',
> >                  'KERNEL_IMAGETYPE', 'IMAGE_NAME', 'IMAGE_LINK_NAME',
> >                  'STAGING_DIR_NATIVE', 'STAGING_BINDIR_NATIVE',
> > -                'STAGING_DIR_HOST', 'SERIAL_CONSOLES']
> > +                'STAGING_DIR_HOST', 'SERIAL_CONSOLES', 'UNINATIVE_LOADER']
> >      return build_vars + [k for k in d.keys() if k.startswith('QB_')]
> >
> >  do_write_qemuboot_conf[vardeps] += "${@' '.join(qemuboot_vars(d))}"
> > diff --git a/scripts/runqemu b/scripts/runqemu
> > index 4e05c1bb15..7d1f85f357 100755
> > --- a/scripts/runqemu
> > +++ b/scripts/runqemu
> > @@ -460,6 +460,10 @@ class BaseConfig(object):
> >          except subprocess.CalledProcessError as e:
> >              raise RunQemuError("Could not determine the path to dri drivers on the host via pkg-config.\nPlease install Mesa development files (particularly, dri.pc) on the host machine.")
> >          os.environ['LIBGL_DRIVERS_PATH'] = dripath.decode('utf-8').strip()
> > +        uninative_path = os.path.dirname(self.get("UNINATIVE_LOADER"))
> > +        preload_items = ['libdl.so.2', 'librt.so.1', 'libpthread.so.0']
> > +        preload_paths = [os.path.join(uninative_path, i) for i in preload_items]
> > +        os.environ['LD_PRELOAD'] = " ".join(preload_paths)
> >
> >      def check_args(self):
> >          for debug in ("-d", "--debug"):
> > --
> > 2.20.1
> >
> >
> > -=-=-=-=-=-=-=-=-=-=-=-
> > Links: You receive all messages sent to this group.
> > View/Reply Online (#161382): https://lists.openembedded.org/g/openembedded-core/message/161382
> > Mute This Topic: https://lists.openembedded.org/mt/88916306/3616693
> > Group Owner: openembedded-core+owner@lists.openembedded.org
> > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [JPEWhacker@gmail.com]
> > -=-=-=-=-=-=-=-=-=-=-=-
> >
Joshua Watt Oct. 21, 2022, 3:48 p.m. UTC | #11
Ya I've tracked it down to when qemu invokes the qemu-oe-bridge-helper 
to setup network bridging. This is a shell script that uses /bin/sh, and 
as the log indicates, /bin/sh can't find the required symbols to start 
up (and qemu fails).

I also see it when runqemu attempt so to invoke the stty program to 
cleanup the console after qemu runs for the same reason. This one is a 
little easier to fix; I have a prototype patch that only passes the 
munged environment that sets LD_PRELOAD when runqemu actually invokes 
qemu by passing env= to subprocess. The other process invocations with 
subprcess are not passed this environment, so they don't see the 
LD_PRELOAD. This doesn't fix the bridge problem however because in that 
case, qemu is invoking the script so the script inherits qemu's environment.

On 10/21/22 10:43, Alexander Kanavin wrote:
> This is the first time I hear about this - can you find out what is
> expecting the symbol, and where it's supposed to come from?
>
> Alex
>
> On Fri, 21 Oct 2022 at 17:27, Joshua Watt <jpewhacker@gmail.com> wrote:
>> This patch broke runqemu for me when I moved to kirkstone. I get this error:
>>
>>   /bin/sh: symbol lookup error:
>> /grmn/prj/mrn/alchemy/build/tmp/eng/kirkstone/tetra/sysroots-uninative/x86_64-linux/lib/librt.so.1:
>> undefined symbol: __libc_unwind_link_get, version GLIBC_PRIVATE
>>
>> And I'm not sure how to fix it. Reverting this change does resolve the problem.
>>
>> My host is Ubuntu 20.04
>>
>>
>>
>> On Fri, Feb 4, 2022 at 2:40 PM Alexander Kanavin <alex.kanavin@gmail.com> wrote:
>>> Some of the host distributions build the drivers in a way (RPATH/RUNPATH)
>>> that tricks uninative loader into loading pieces of the host libc, if
>>> the same pieces haven't been previously loaded by native binaries. Mixing
>>> the two libc versions leads to failures.
>>>
>>> This change ensures that the correct (uninative) versions are always in use.
>>>
>>> Signed-off-by: Alexander Kanavin <alex@linutronix.de>
>>> ---
>>>   meta/classes/qemuboot.bbclass | 2 +-
>>>   scripts/runqemu               | 4 ++++
>>>   2 files changed, 5 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/meta/classes/qemuboot.bbclass b/meta/classes/qemuboot.bbclass
>>> index cc1cbce69d..229bd88527 100644
>>> --- a/meta/classes/qemuboot.bbclass
>>> +++ b/meta/classes/qemuboot.bbclass
>>> @@ -109,7 +109,7 @@ def qemuboot_vars(d):
>>>       build_vars = ['MACHINE', 'TUNE_ARCH', 'DEPLOY_DIR_IMAGE',
>>>                   'KERNEL_IMAGETYPE', 'IMAGE_NAME', 'IMAGE_LINK_NAME',
>>>                   'STAGING_DIR_NATIVE', 'STAGING_BINDIR_NATIVE',
>>> -                'STAGING_DIR_HOST', 'SERIAL_CONSOLES']
>>> +                'STAGING_DIR_HOST', 'SERIAL_CONSOLES', 'UNINATIVE_LOADER']
>>>       return build_vars + [k for k in d.keys() if k.startswith('QB_')]
>>>
>>>   do_write_qemuboot_conf[vardeps] += "${@' '.join(qemuboot_vars(d))}"
>>> diff --git a/scripts/runqemu b/scripts/runqemu
>>> index 4e05c1bb15..7d1f85f357 100755
>>> --- a/scripts/runqemu
>>> +++ b/scripts/runqemu
>>> @@ -460,6 +460,10 @@ class BaseConfig(object):
>>>           except subprocess.CalledProcessError as e:
>>>               raise RunQemuError("Could not determine the path to dri drivers on the host via pkg-config.\nPlease install Mesa development files (particularly, dri.pc) on the host machine.")
>>>           os.environ['LIBGL_DRIVERS_PATH'] = dripath.decode('utf-8').strip()
>>> +        uninative_path = os.path.dirname(self.get("UNINATIVE_LOADER"))
>>> +        preload_items = ['libdl.so.2', 'librt.so.1', 'libpthread.so.0']
>>> +        preload_paths = [os.path.join(uninative_path, i) for i in preload_items]
>>> +        os.environ['LD_PRELOAD'] = " ".join(preload_paths)
>>>
>>>       def check_args(self):
>>>           for debug in ("-d", "--debug"):
>>> --
>>> 2.20.1
>>>
>>>
>>> -=-=-=-=-=-=-=-=-=-=-=-
>>> Links: You receive all messages sent to this group.
>>> View/Reply Online (#161382): https://lists.openembedded.org/g/openembedded-core/message/161382
>>> Mute This Topic: https://lists.openembedded.org/mt/88916306/3616693
>>> Group Owner: openembedded-core+owner@lists.openembedded.org
>>> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [JPEWhacker@gmail.com]
>>> -=-=-=-=-=-=-=-=-=-=-=-
>>>
Alexander Kanavin Oct. 21, 2022, 3:54 p.m. UTC | #12
I think we had a similar problem in rust, and I ended up rewriting the
shell script in python and running it with nativepython3 :-)

Alex

On Fri, 21 Oct 2022 at 17:48, Joshua Watt <jpewhacker@gmail.com> wrote:
>
> Ya I've tracked it down to when qemu invokes the qemu-oe-bridge-helper
> to setup network bridging. This is a shell script that uses /bin/sh, and
> as the log indicates, /bin/sh can't find the required symbols to start
> up (and qemu fails).
>
> I also see it when runqemu attempt so to invoke the stty program to
> cleanup the console after qemu runs for the same reason. This one is a
> little easier to fix; I have a prototype patch that only passes the
> munged environment that sets LD_PRELOAD when runqemu actually invokes
> qemu by passing env= to subprocess. The other process invocations with
> subprcess are not passed this environment, so they don't see the
> LD_PRELOAD. This doesn't fix the bridge problem however because in that
> case, qemu is invoking the script so the script inherits qemu's environment.
>
> On 10/21/22 10:43, Alexander Kanavin wrote:
> > This is the first time I hear about this - can you find out what is
> > expecting the symbol, and where it's supposed to come from?
> >
> > Alex
> >
> > On Fri, 21 Oct 2022 at 17:27, Joshua Watt <jpewhacker@gmail.com> wrote:
> >> This patch broke runqemu for me when I moved to kirkstone. I get this error:
> >>
> >>   /bin/sh: symbol lookup error:
> >> /grmn/prj/mrn/alchemy/build/tmp/eng/kirkstone/tetra/sysroots-uninative/x86_64-linux/lib/librt.so.1:
> >> undefined symbol: __libc_unwind_link_get, version GLIBC_PRIVATE
> >>
> >> And I'm not sure how to fix it. Reverting this change does resolve the problem.
> >>
> >> My host is Ubuntu 20.04
> >>
> >>
> >>
> >> On Fri, Feb 4, 2022 at 2:40 PM Alexander Kanavin <alex.kanavin@gmail.com> wrote:
> >>> Some of the host distributions build the drivers in a way (RPATH/RUNPATH)
> >>> that tricks uninative loader into loading pieces of the host libc, if
> >>> the same pieces haven't been previously loaded by native binaries. Mixing
> >>> the two libc versions leads to failures.
> >>>
> >>> This change ensures that the correct (uninative) versions are always in use.
> >>>
> >>> Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> >>> ---
> >>>   meta/classes/qemuboot.bbclass | 2 +-
> >>>   scripts/runqemu               | 4 ++++
> >>>   2 files changed, 5 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/meta/classes/qemuboot.bbclass b/meta/classes/qemuboot.bbclass
> >>> index cc1cbce69d..229bd88527 100644
> >>> --- a/meta/classes/qemuboot.bbclass
> >>> +++ b/meta/classes/qemuboot.bbclass
> >>> @@ -109,7 +109,7 @@ def qemuboot_vars(d):
> >>>       build_vars = ['MACHINE', 'TUNE_ARCH', 'DEPLOY_DIR_IMAGE',
> >>>                   'KERNEL_IMAGETYPE', 'IMAGE_NAME', 'IMAGE_LINK_NAME',
> >>>                   'STAGING_DIR_NATIVE', 'STAGING_BINDIR_NATIVE',
> >>> -                'STAGING_DIR_HOST', 'SERIAL_CONSOLES']
> >>> +                'STAGING_DIR_HOST', 'SERIAL_CONSOLES', 'UNINATIVE_LOADER']
> >>>       return build_vars + [k for k in d.keys() if k.startswith('QB_')]
> >>>
> >>>   do_write_qemuboot_conf[vardeps] += "${@' '.join(qemuboot_vars(d))}"
> >>> diff --git a/scripts/runqemu b/scripts/runqemu
> >>> index 4e05c1bb15..7d1f85f357 100755
> >>> --- a/scripts/runqemu
> >>> +++ b/scripts/runqemu
> >>> @@ -460,6 +460,10 @@ class BaseConfig(object):
> >>>           except subprocess.CalledProcessError as e:
> >>>               raise RunQemuError("Could not determine the path to dri drivers on the host via pkg-config.\nPlease install Mesa development files (particularly, dri.pc) on the host machine.")
> >>>           os.environ['LIBGL_DRIVERS_PATH'] = dripath.decode('utf-8').strip()
> >>> +        uninative_path = os.path.dirname(self.get("UNINATIVE_LOADER"))
> >>> +        preload_items = ['libdl.so.2', 'librt.so.1', 'libpthread.so.0']
> >>> +        preload_paths = [os.path.join(uninative_path, i) for i in preload_items]
> >>> +        os.environ['LD_PRELOAD'] = " ".join(preload_paths)
> >>>
> >>>       def check_args(self):
> >>>           for debug in ("-d", "--debug"):
> >>> --
> >>> 2.20.1
> >>>
> >>>
> >>> -=-=-=-=-=-=-=-=-=-=-=-
> >>> Links: You receive all messages sent to this group.
> >>> View/Reply Online (#161382): https://lists.openembedded.org/g/openembedded-core/message/161382
> >>> Mute This Topic: https://lists.openembedded.org/mt/88916306/3616693
> >>> Group Owner: openembedded-core+owner@lists.openembedded.org
> >>> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [JPEWhacker@gmail.com]
> >>> -=-=-=-=-=-=-=-=-=-=-=-
> >>>
Joshua Watt Oct. 21, 2022, 4:21 p.m. UTC | #13
On Fri, Oct 21, 2022 at 10:54 AM Alexander Kanavin
<alex.kanavin@gmail.com> wrote:
>
> I think we had a similar problem in rust, and I ended up rewriting the
> shell script in python and running it with nativepython3 :-)

I had to re-write the script to be a C program because there wasn't
any way to make qemu find and invoke nativepython3, but that appears
to work. I'll send a patch

>
> Alex
>
> On Fri, 21 Oct 2022 at 17:48, Joshua Watt <jpewhacker@gmail.com> wrote:
> >
> > Ya I've tracked it down to when qemu invokes the qemu-oe-bridge-helper
> > to setup network bridging. This is a shell script that uses /bin/sh, and
> > as the log indicates, /bin/sh can't find the required symbols to start
> > up (and qemu fails).
> >
> > I also see it when runqemu attempt so to invoke the stty program to
> > cleanup the console after qemu runs for the same reason. This one is a
> > little easier to fix; I have a prototype patch that only passes the
> > munged environment that sets LD_PRELOAD when runqemu actually invokes
> > qemu by passing env= to subprocess. The other process invocations with
> > subprcess are not passed this environment, so they don't see the
> > LD_PRELOAD. This doesn't fix the bridge problem however because in that
> > case, qemu is invoking the script so the script inherits qemu's environment.
> >
> > On 10/21/22 10:43, Alexander Kanavin wrote:
> > > This is the first time I hear about this - can you find out what is
> > > expecting the symbol, and where it's supposed to come from?
> > >
> > > Alex
> > >
> > > On Fri, 21 Oct 2022 at 17:27, Joshua Watt <jpewhacker@gmail.com> wrote:
> > >> This patch broke runqemu for me when I moved to kirkstone. I get this error:
> > >>
> > >>   /bin/sh: symbol lookup error:
> > >> /grmn/prj/mrn/alchemy/build/tmp/eng/kirkstone/tetra/sysroots-uninative/x86_64-linux/lib/librt.so.1:
> > >> undefined symbol: __libc_unwind_link_get, version GLIBC_PRIVATE
> > >>
> > >> And I'm not sure how to fix it. Reverting this change does resolve the problem.
> > >>
> > >> My host is Ubuntu 20.04
> > >>
> > >>
> > >>
> > >> On Fri, Feb 4, 2022 at 2:40 PM Alexander Kanavin <alex.kanavin@gmail.com> wrote:
> > >>> Some of the host distributions build the drivers in a way (RPATH/RUNPATH)
> > >>> that tricks uninative loader into loading pieces of the host libc, if
> > >>> the same pieces haven't been previously loaded by native binaries. Mixing
> > >>> the two libc versions leads to failures.
> > >>>
> > >>> This change ensures that the correct (uninative) versions are always in use.
> > >>>
> > >>> Signed-off-by: Alexander Kanavin <alex@linutronix.de>
> > >>> ---
> > >>>   meta/classes/qemuboot.bbclass | 2 +-
> > >>>   scripts/runqemu               | 4 ++++
> > >>>   2 files changed, 5 insertions(+), 1 deletion(-)
> > >>>
> > >>> diff --git a/meta/classes/qemuboot.bbclass b/meta/classes/qemuboot.bbclass
> > >>> index cc1cbce69d..229bd88527 100644
> > >>> --- a/meta/classes/qemuboot.bbclass
> > >>> +++ b/meta/classes/qemuboot.bbclass
> > >>> @@ -109,7 +109,7 @@ def qemuboot_vars(d):
> > >>>       build_vars = ['MACHINE', 'TUNE_ARCH', 'DEPLOY_DIR_IMAGE',
> > >>>                   'KERNEL_IMAGETYPE', 'IMAGE_NAME', 'IMAGE_LINK_NAME',
> > >>>                   'STAGING_DIR_NATIVE', 'STAGING_BINDIR_NATIVE',
> > >>> -                'STAGING_DIR_HOST', 'SERIAL_CONSOLES']
> > >>> +                'STAGING_DIR_HOST', 'SERIAL_CONSOLES', 'UNINATIVE_LOADER']
> > >>>       return build_vars + [k for k in d.keys() if k.startswith('QB_')]
> > >>>
> > >>>   do_write_qemuboot_conf[vardeps] += "${@' '.join(qemuboot_vars(d))}"
> > >>> diff --git a/scripts/runqemu b/scripts/runqemu
> > >>> index 4e05c1bb15..7d1f85f357 100755
> > >>> --- a/scripts/runqemu
> > >>> +++ b/scripts/runqemu
> > >>> @@ -460,6 +460,10 @@ class BaseConfig(object):
> > >>>           except subprocess.CalledProcessError as e:
> > >>>               raise RunQemuError("Could not determine the path to dri drivers on the host via pkg-config.\nPlease install Mesa development files (particularly, dri.pc) on the host machine.")
> > >>>           os.environ['LIBGL_DRIVERS_PATH'] = dripath.decode('utf-8').strip()
> > >>> +        uninative_path = os.path.dirname(self.get("UNINATIVE_LOADER"))
> > >>> +        preload_items = ['libdl.so.2', 'librt.so.1', 'libpthread.so.0']
> > >>> +        preload_paths = [os.path.join(uninative_path, i) for i in preload_items]
> > >>> +        os.environ['LD_PRELOAD'] = " ".join(preload_paths)
> > >>>
> > >>>       def check_args(self):
> > >>>           for debug in ("-d", "--debug"):
> > >>> --
> > >>> 2.20.1
> > >>>
> > >>>
> > >>> -=-=-=-=-=-=-=-=-=-=-=-
> > >>> Links: You receive all messages sent to this group.
> > >>> View/Reply Online (#161382): https://lists.openembedded.org/g/openembedded-core/message/161382
> > >>> Mute This Topic: https://lists.openembedded.org/mt/88916306/3616693
> > >>> Group Owner: openembedded-core+owner@lists.openembedded.org
> > >>> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [JPEWhacker@gmail.com]
> > >>> -=-=-=-=-=-=-=-=-=-=-=-
> > >>>

Patch

diff --git a/meta/classes/qemuboot.bbclass b/meta/classes/qemuboot.bbclass
index cc1cbce69d..229bd88527 100644
--- a/meta/classes/qemuboot.bbclass
+++ b/meta/classes/qemuboot.bbclass
@@ -109,7 +109,7 @@  def qemuboot_vars(d):
     build_vars = ['MACHINE', 'TUNE_ARCH', 'DEPLOY_DIR_IMAGE',
                 'KERNEL_IMAGETYPE', 'IMAGE_NAME', 'IMAGE_LINK_NAME',
                 'STAGING_DIR_NATIVE', 'STAGING_BINDIR_NATIVE',
-                'STAGING_DIR_HOST', 'SERIAL_CONSOLES']
+                'STAGING_DIR_HOST', 'SERIAL_CONSOLES', 'UNINATIVE_LOADER']
     return build_vars + [k for k in d.keys() if k.startswith('QB_')]
 
 do_write_qemuboot_conf[vardeps] += "${@' '.join(qemuboot_vars(d))}"
diff --git a/scripts/runqemu b/scripts/runqemu
index 4e05c1bb15..7d1f85f357 100755
--- a/scripts/runqemu
+++ b/scripts/runqemu
@@ -460,6 +460,10 @@  class BaseConfig(object):
         except subprocess.CalledProcessError as e:
             raise RunQemuError("Could not determine the path to dri drivers on the host via pkg-config.\nPlease install Mesa development files (particularly, dri.pc) on the host machine.")
         os.environ['LIBGL_DRIVERS_PATH'] = dripath.decode('utf-8').strip()
+        uninative_path = os.path.dirname(self.get("UNINATIVE_LOADER"))
+        preload_items = ['libdl.so.2', 'librt.so.1', 'libpthread.so.0']
+        preload_paths = [os.path.join(uninative_path, i) for i in preload_items]
+        os.environ['LD_PRELOAD'] = " ".join(preload_paths)
 
     def check_args(self):
         for debug in ("-d", "--debug"):