* [OE-core][PATCH] runqemu: Do not perturb script environment
@ 2022-10-21 19:23 Joshua Watt
2022-10-26 14:08 ` Joshua Watt
0 siblings, 1 reply; 2+ messages in thread
From: Joshua Watt @ 2022-10-21 19:23 UTC (permalink / raw)
To: openembedded-core; +Cc: Joshua Watt
Instead of changing the script environment to affect the child
processes, make a copy of the environment with modifications and pass
that to subprocess.
Specifically, when dri rendering is enabled, LD_PRELOAD was being passed
to all processes created by the script which resulted in other commands
(e.g. stty) exiting with a failure like:
/bin/sh: symbol lookup error: sysroots-uninative/x86_64-linux/lib/librt.so.1: undefined symbol: __libc_unwind_link_get, version GLIBC_PRIVATE
Making a copy of the environment fixes this because the LD_PRELOAD is
now only passed to qemu itself.
Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
---
scripts/runqemu | 26 ++++++++++++++------------
1 file changed, 14 insertions(+), 12 deletions(-)
diff --git a/scripts/runqemu b/scripts/runqemu
index 189fc3da91..a6ea578564 100755
--- a/scripts/runqemu
+++ b/scripts/runqemu
@@ -210,6 +210,7 @@ class BaseConfig(object):
self.mac_tap = "52:54:00:12:34:"
self.mac_slirp = "52:54:00:12:35:"
# pid of the actual qemu process
+ self.qemu_environ = os.environ.copy()
self.qemupid = None
# avoid cleanup twice
self.cleaned = False
@@ -449,18 +450,19 @@ class BaseConfig(object):
# As runqemu can be run within bitbake (when using testimage, for example),
# we need to ensure that we run host pkg-config, and that it does not
# get mis-directed to native build paths set by bitbake.
+ env = os.environ.copy()
try:
- del os.environ['PKG_CONFIG_PATH']
- del os.environ['PKG_CONFIG_DIR']
- del os.environ['PKG_CONFIG_LIBDIR']
- del os.environ['PKG_CONFIG_SYSROOT_DIR']
+ del env['PKG_CONFIG_PATH']
+ del env['PKG_CONFIG_DIR']
+ del env['PKG_CONFIG_LIBDIR']
+ del env['PKG_CONFIG_SYSROOT_DIR']
except KeyError:
pass
try:
- dripath = subprocess.check_output("PATH=/bin:/usr/bin:$PATH pkg-config --variable=dridriverdir dri", shell=True)
+ dripath = subprocess.check_output("PATH=/bin:/usr/bin:$PATH pkg-config --variable=dridriverdir dri", shell=True, env=env)
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()
+ self.qemu_environ['LIBGL_DRIVERS_PATH'] = dripath.decode('utf-8').strip()
# This preloads uninative libc pieces and therefore ensures that RPATH/RUNPATH
# in host mesa drivers doesn't trick uninative into loading host libc.
@@ -468,7 +470,7 @@ class BaseConfig(object):
uninative_path = os.path.dirname(self.get("UNINATIVE_LOADER"))
if os.path.exists(uninative_path):
preload_paths = [os.path.join(uninative_path, i) for i in preload_items]
- os.environ['LD_PRELOAD'] = " ".join(preload_paths)
+ self.qemu_environ['LD_PRELOAD'] = " ".join(preload_paths)
def check_args(self):
for debug in ("-d", "--debug"):
@@ -482,8 +484,8 @@ class BaseConfig(object):
sys.argv.remove(quiet)
if 'gl' not in sys.argv[1:] and 'gl-es' not in sys.argv[1:]:
- os.environ['SDL_RENDER_DRIVER'] = 'software'
- os.environ['SDL_FRAMEBUFFER_ACCELERATION'] = 'false'
+ self.qemu_environ['SDL_RENDER_DRIVER'] = 'software'
+ self.qemu_environ['SDL_FRAMEBUFFER_ACCELERATION'] = 'false'
unknown_arg = ""
for arg in sys.argv[1:]:
@@ -1369,7 +1371,7 @@ class BaseConfig(object):
# need our font setup and show-cusor below so we need to see what qemu --help says
# is supported so we can pass our correct config in.
if not self.nographic and not self.sdl and not self.gtk and not self.publicvnc and not self.egl_headless == True:
- output = subprocess.check_output([self.qemu_bin, "--help"], universal_newlines=True)
+ output = subprocess.check_output([self.qemu_bin, "--help"], universal_newlines=True, env=self.qemu_environ)
if "-display gtk" in output:
self.gtk = True
elif "-display sdl" in output:
@@ -1393,7 +1395,7 @@ class BaseConfig(object):
if self.sdl == True:
self.qemu_opt += 'sdl,'
elif self.gtk == True:
- os.environ['FONTCONFIG_PATH'] = '/etc/fonts'
+ self.qemu_environ['FONTCONFIG_PATH'] = '/etc/fonts'
self.qemu_opt += 'gtk,'
if self.gl == True:
@@ -1514,7 +1516,7 @@ class BaseConfig(object):
if len(self.portlocks):
for descriptor in self.portlocks.values():
pass_fds.append(descriptor.fileno())
- process = subprocess.Popen(cmds, stderr=subprocess.PIPE, pass_fds=pass_fds)
+ process = subprocess.Popen(cmds, stderr=subprocess.PIPE, pass_fds=pass_fds, env=self.qemu_environ)
self.qemupid = process.pid
retcode = process.wait()
if retcode:
--
2.33.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [OE-core][PATCH] runqemu: Do not perturb script environment
2022-10-21 19:23 [OE-core][PATCH] runqemu: Do not perturb script environment Joshua Watt
@ 2022-10-26 14:08 ` Joshua Watt
0 siblings, 0 replies; 2+ messages in thread
From: Joshua Watt @ 2022-10-26 14:08 UTC (permalink / raw)
To: openembedded-core; +Cc: Steve Sakoman
Steve,
Please backport this to kirkstone at your convenience.
Thanks
On Fri, Oct 21, 2022 at 2:23 PM Joshua Watt <jpewhacker@gmail.com> wrote:
>
> Instead of changing the script environment to affect the child
> processes, make a copy of the environment with modifications and pass
> that to subprocess.
>
> Specifically, when dri rendering is enabled, LD_PRELOAD was being passed
> to all processes created by the script which resulted in other commands
> (e.g. stty) exiting with a failure like:
>
> /bin/sh: symbol lookup error: sysroots-uninative/x86_64-linux/lib/librt.so.1: undefined symbol: __libc_unwind_link_get, version GLIBC_PRIVATE
>
> Making a copy of the environment fixes this because the LD_PRELOAD is
> now only passed to qemu itself.
>
> Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
> ---
> scripts/runqemu | 26 ++++++++++++++------------
> 1 file changed, 14 insertions(+), 12 deletions(-)
>
> diff --git a/scripts/runqemu b/scripts/runqemu
> index 189fc3da91..a6ea578564 100755
> --- a/scripts/runqemu
> +++ b/scripts/runqemu
> @@ -210,6 +210,7 @@ class BaseConfig(object):
> self.mac_tap = "52:54:00:12:34:"
> self.mac_slirp = "52:54:00:12:35:"
> # pid of the actual qemu process
> + self.qemu_environ = os.environ.copy()
> self.qemupid = None
> # avoid cleanup twice
> self.cleaned = False
> @@ -449,18 +450,19 @@ class BaseConfig(object):
> # As runqemu can be run within bitbake (when using testimage, for example),
> # we need to ensure that we run host pkg-config, and that it does not
> # get mis-directed to native build paths set by bitbake.
> + env = os.environ.copy()
> try:
> - del os.environ['PKG_CONFIG_PATH']
> - del os.environ['PKG_CONFIG_DIR']
> - del os.environ['PKG_CONFIG_LIBDIR']
> - del os.environ['PKG_CONFIG_SYSROOT_DIR']
> + del env['PKG_CONFIG_PATH']
> + del env['PKG_CONFIG_DIR']
> + del env['PKG_CONFIG_LIBDIR']
> + del env['PKG_CONFIG_SYSROOT_DIR']
> except KeyError:
> pass
> try:
> - dripath = subprocess.check_output("PATH=/bin:/usr/bin:$PATH pkg-config --variable=dridriverdir dri", shell=True)
> + dripath = subprocess.check_output("PATH=/bin:/usr/bin:$PATH pkg-config --variable=dridriverdir dri", shell=True, env=env)
> 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()
> + self.qemu_environ['LIBGL_DRIVERS_PATH'] = dripath.decode('utf-8').strip()
>
> # This preloads uninative libc pieces and therefore ensures that RPATH/RUNPATH
> # in host mesa drivers doesn't trick uninative into loading host libc.
> @@ -468,7 +470,7 @@ class BaseConfig(object):
> uninative_path = os.path.dirname(self.get("UNINATIVE_LOADER"))
> if os.path.exists(uninative_path):
> preload_paths = [os.path.join(uninative_path, i) for i in preload_items]
> - os.environ['LD_PRELOAD'] = " ".join(preload_paths)
> + self.qemu_environ['LD_PRELOAD'] = " ".join(preload_paths)
>
> def check_args(self):
> for debug in ("-d", "--debug"):
> @@ -482,8 +484,8 @@ class BaseConfig(object):
> sys.argv.remove(quiet)
>
> if 'gl' not in sys.argv[1:] and 'gl-es' not in sys.argv[1:]:
> - os.environ['SDL_RENDER_DRIVER'] = 'software'
> - os.environ['SDL_FRAMEBUFFER_ACCELERATION'] = 'false'
> + self.qemu_environ['SDL_RENDER_DRIVER'] = 'software'
> + self.qemu_environ['SDL_FRAMEBUFFER_ACCELERATION'] = 'false'
>
> unknown_arg = ""
> for arg in sys.argv[1:]:
> @@ -1369,7 +1371,7 @@ class BaseConfig(object):
> # need our font setup and show-cusor below so we need to see what qemu --help says
> # is supported so we can pass our correct config in.
> if not self.nographic and not self.sdl and not self.gtk and not self.publicvnc and not self.egl_headless == True:
> - output = subprocess.check_output([self.qemu_bin, "--help"], universal_newlines=True)
> + output = subprocess.check_output([self.qemu_bin, "--help"], universal_newlines=True, env=self.qemu_environ)
> if "-display gtk" in output:
> self.gtk = True
> elif "-display sdl" in output:
> @@ -1393,7 +1395,7 @@ class BaseConfig(object):
> if self.sdl == True:
> self.qemu_opt += 'sdl,'
> elif self.gtk == True:
> - os.environ['FONTCONFIG_PATH'] = '/etc/fonts'
> + self.qemu_environ['FONTCONFIG_PATH'] = '/etc/fonts'
> self.qemu_opt += 'gtk,'
>
> if self.gl == True:
> @@ -1514,7 +1516,7 @@ class BaseConfig(object):
> if len(self.portlocks):
> for descriptor in self.portlocks.values():
> pass_fds.append(descriptor.fileno())
> - process = subprocess.Popen(cmds, stderr=subprocess.PIPE, pass_fds=pass_fds)
> + process = subprocess.Popen(cmds, stderr=subprocess.PIPE, pass_fds=pass_fds, env=self.qemu_environ)
> self.qemupid = process.pid
> retcode = process.wait()
> if retcode:
> --
> 2.33.0
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2022-10-26 14:08 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-21 19:23 [OE-core][PATCH] runqemu: Do not perturb script environment Joshua Watt
2022-10-26 14:08 ` Joshua Watt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox