Openembedded Core Discussions
 help / color / mirror / Atom feed
* [PATCH] postinst-intercepts, qemu.bbclass: fix segfaults in postinstalls
@ 2013-04-09 15:53 Laurentiu Palcu
  2013-04-09 21:58 ` Richard Purdie
  2013-04-10 11:25 ` [PATCH v2] " Laurentiu Palcu
  0 siblings, 2 replies; 5+ messages in thread
From: Laurentiu Palcu @ 2013-04-09 15:53 UTC (permalink / raw)
  To: openembedded-core

Postinstalls that use qemu are throwing a segmentation fault when
building for qemux86-64 on a 64bit host (it might also happen for
qemux86 if building on a 32bit host but I didn't test). It looks like
qemu looks for ld.so.cache which is not found because it is generated
after rootfs_(rpm|ipk|deb)_do_rootfs is called and then it tries to load
libraries from the default paths (which are the host's). In order to
avoid this, pass the LD_LIBRARY_PATH explicitly to the target's dynamic
loader.

Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com>
---
 meta/classes/qemu.bbclass                       |    4 +++-
 scripts/postinst-intercepts/update_font_cache   |    3 ++-
 scripts/postinst-intercepts/update_pixbuf_cache |    3 ++-
 3 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/meta/classes/qemu.bbclass b/meta/classes/qemu.bbclass
index 0e71d6a..6881826 100644
--- a/meta/classes/qemu.bbclass
+++ b/meta/classes/qemu.bbclass
@@ -29,4 +29,6 @@ def qemu_run_binary(data, rootfs_path, binary):
     if qemu_binary == "qemu-allarch":
         qemu_binary = "qemuwrapper"
 
-    return "PSEUDO_UNLOAD=1 " + qemu_binary + " -L " + rootfs_path + " " + rootfs_path + binary
+    return "PSEUDO_UNLOAD=1 " + qemu_binary + " -L " + rootfs_path\
+            + " -E LD_LIBRARY_PATH=" + rootfs_path + "/lib:" + rootfs_path\
+            + "/usr/lib " + rootfs_path + binary
diff --git a/scripts/postinst-intercepts/update_font_cache b/scripts/postinst-intercepts/update_font_cache
index ad1bab3..fa2c0ef 100644
--- a/scripts/postinst-intercepts/update_font_cache
+++ b/scripts/postinst-intercepts/update_font_cache
@@ -1,5 +1,6 @@
 #!/bin/sh
 
-PSEUDO_UNLOAD=1 qemuwrapper -L $D $D${bindir}/fc-cache --sysroot=$D >/dev/null 2>&1
+PSEUDO_UNLOAD=1 qemuwrapper -L $D -E LD_LIBRARY_PATH=$D/lib:$D/usr/lib\
+					$D${bindir}/fc-cache --sysroot=$D >/dev/null 2>&1
 
 
diff --git a/scripts/postinst-intercepts/update_pixbuf_cache b/scripts/postinst-intercepts/update_pixbuf_cache
index 9134529..fbb6fd1 100644
--- a/scripts/postinst-intercepts/update_pixbuf_cache
+++ b/scripts/postinst-intercepts/update_pixbuf_cache
@@ -2,7 +2,8 @@
 
 export GDK_PIXBUF_MODULEDIR=$D${libdir}/gdk-pixbuf-2.0/2.10.0/loaders
 
-PSEUDO_UNLOAD=1 qemuwrapper -L $D $D${bindir}/gdk-pixbuf-query-loaders \
+PSEUDO_UNLOAD=1 qemuwrapper -L $D -E LD_LIBRARY_PATH=$D/lib:$D/usr/lib\
+    $D${bindir}/gdk-pixbuf-query-loaders \
     >$GDK_PIXBUF_MODULEDIR/../loaders.cache 2>/dev/null && \
     sed -i -e "s:$D::g" $GDK_PIXBUF_MODULEDIR/../loaders.cache
 
-- 
1.7.9.5




^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] postinst-intercepts, qemu.bbclass: fix segfaults in postinstalls
  2013-04-09 15:53 [PATCH] postinst-intercepts, qemu.bbclass: fix segfaults in postinstalls Laurentiu Palcu
@ 2013-04-09 21:58 ` Richard Purdie
  2013-04-10  7:38   ` Laurentiu Palcu
  2013-04-10 11:25 ` [PATCH v2] " Laurentiu Palcu
  1 sibling, 1 reply; 5+ messages in thread
From: Richard Purdie @ 2013-04-09 21:58 UTC (permalink / raw)
  To: Laurentiu Palcu; +Cc: openembedded-core

On Tue, 2013-04-09 at 18:53 +0300, Laurentiu Palcu wrote:
> Postinstalls that use qemu are throwing a segmentation fault when
> building for qemux86-64 on a 64bit host (it might also happen for
> qemux86 if building on a 32bit host but I didn't test). It looks like
> qemu looks for ld.so.cache which is not found because it is generated
> after rootfs_(rpm|ipk|deb)_do_rootfs is called and then it tries to load
> libraries from the default paths (which are the host's). In order to
> avoid this, pass the LD_LIBRARY_PATH explicitly to the target's dynamic
> loader.
> 
> Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com>
> ---
>  meta/classes/qemu.bbclass                       |    4 +++-
>  scripts/postinst-intercepts/update_font_cache   |    3 ++-
>  scripts/postinst-intercepts/update_pixbuf_cache |    3 ++-
>  3 files changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/meta/classes/qemu.bbclass b/meta/classes/qemu.bbclass
> index 0e71d6a..6881826 100644
> --- a/meta/classes/qemu.bbclass
> +++ b/meta/classes/qemu.bbclass
> @@ -29,4 +29,6 @@ def qemu_run_binary(data, rootfs_path, binary):
>      if qemu_binary == "qemu-allarch":
>          qemu_binary = "qemuwrapper"
>  
> -    return "PSEUDO_UNLOAD=1 " + qemu_binary + " -L " + rootfs_path + " " + rootfs_path + binary
> +    return "PSEUDO_UNLOAD=1 " + qemu_binary + " -L " + rootfs_path\
> +            + " -E LD_LIBRARY_PATH=" + rootfs_path + "/lib:" + rootfs_path\
> +            + "/usr/lib " + rootfs_path + binary

This isn't going to work with multilibs. Can we reorder the rootfs code
so the ld.so.cache piece happens before the intercepts?

Cheers,

Richard

> diff --git a/scripts/postinst-intercepts/update_font_cache b/scripts/postinst-intercepts/update_font_cache
> index ad1bab3..fa2c0ef 100644
> --- a/scripts/postinst-intercepts/update_font_cache
> +++ b/scripts/postinst-intercepts/update_font_cache
> @@ -1,5 +1,6 @@
>  #!/bin/sh
>  
> -PSEUDO_UNLOAD=1 qemuwrapper -L $D $D${bindir}/fc-cache --sysroot=$D >/dev/null 2>&1
> +PSEUDO_UNLOAD=1 qemuwrapper -L $D -E LD_LIBRARY_PATH=$D/lib:$D/usr/lib\
> +					$D${bindir}/fc-cache --sysroot=$D >/dev/null 2>&1
>  
> 
> diff --git a/scripts/postinst-intercepts/update_pixbuf_cache b/scripts/postinst-intercepts/update_pixbuf_cache
> index 9134529..fbb6fd1 100644
> --- a/scripts/postinst-intercepts/update_pixbuf_cache
> +++ b/scripts/postinst-intercepts/update_pixbuf_cache
> @@ -2,7 +2,8 @@
>  
>  export GDK_PIXBUF_MODULEDIR=$D${libdir}/gdk-pixbuf-2.0/2.10.0/loaders
>  
> -PSEUDO_UNLOAD=1 qemuwrapper -L $D $D${bindir}/gdk-pixbuf-query-loaders \
> +PSEUDO_UNLOAD=1 qemuwrapper -L $D -E LD_LIBRARY_PATH=$D/lib:$D/usr/lib\
> +    $D${bindir}/gdk-pixbuf-query-loaders \
>      >$GDK_PIXBUF_MODULEDIR/../loaders.cache 2>/dev/null && \
>      sed -i -e "s:$D::g" $GDK_PIXBUF_MODULEDIR/../loaders.cache
>  





^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] postinst-intercepts, qemu.bbclass: fix segfaults in postinstalls
  2013-04-09 21:58 ` Richard Purdie
@ 2013-04-10  7:38   ` Laurentiu Palcu
  2013-04-10  8:03     ` Richard Purdie
  0 siblings, 1 reply; 5+ messages in thread
From: Laurentiu Palcu @ 2013-04-10  7:38 UTC (permalink / raw)
  To: Richard Purdie; +Cc: openembedded-core



On 04/10/2013 12:58 AM, Richard Purdie wrote:
> On Tue, 2013-04-09 at 18:53 +0300, Laurentiu Palcu wrote:
>> Postinstalls that use qemu are throwing a segmentation fault when
>> building for qemux86-64 on a 64bit host (it might also happen for
>> qemux86 if building on a 32bit host but I didn't test). It looks like
>> qemu looks for ld.so.cache which is not found because it is generated
>> after rootfs_(rpm|ipk|deb)_do_rootfs is called and then it tries to load
>> libraries from the default paths (which are the host's). In order to
>> avoid this, pass the LD_LIBRARY_PATH explicitly to the target's dynamic
>> loader.
>>
>> Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com>
>> ---
>>  meta/classes/qemu.bbclass                       |    4 +++-
>>  scripts/postinst-intercepts/update_font_cache   |    3 ++-
>>  scripts/postinst-intercepts/update_pixbuf_cache |    3 ++-
>>  3 files changed, 7 insertions(+), 3 deletions(-)
>>
>> diff --git a/meta/classes/qemu.bbclass b/meta/classes/qemu.bbclass
>> index 0e71d6a..6881826 100644
>> --- a/meta/classes/qemu.bbclass
>> +++ b/meta/classes/qemu.bbclass
>> @@ -29,4 +29,6 @@ def qemu_run_binary(data, rootfs_path, binary):
>>      if qemu_binary == "qemu-allarch":
>>          qemu_binary = "qemuwrapper"
>>  
>> -    return "PSEUDO_UNLOAD=1 " + qemu_binary + " -L " + rootfs_path + " " + rootfs_path + binary
>> +    return "PSEUDO_UNLOAD=1 " + qemu_binary + " -L " + rootfs_path\
>> +            + " -E LD_LIBRARY_PATH=" + rootfs_path + "/lib:" + rootfs_path\
>> +            + "/usr/lib " + rootfs_path + binary
> 
> This isn't going to work with multilibs. Can we reorder the rootfs code
> so the ld.so.cache piece happens before the intercepts?
I keep forgetting about multilib... :( I'll find another way.
Unfortunately, it's not enough to generate ld.so.cache before running
the intercept hooks because there are other package postinstalls that
need qemu and those will be run before that. What if, instead of
hardcoding, we use ${libdir} and ${base_libdir}?. These should always
point to the right locations even when working with multilib.

Thanks,
Laurentiu
> 
> Cheers,
> 
> Richard
> 
>> diff --git a/scripts/postinst-intercepts/update_font_cache b/scripts/postinst-intercepts/update_font_cache
>> index ad1bab3..fa2c0ef 100644
>> --- a/scripts/postinst-intercepts/update_font_cache
>> +++ b/scripts/postinst-intercepts/update_font_cache
>> @@ -1,5 +1,6 @@
>>  #!/bin/sh
>>  
>> -PSEUDO_UNLOAD=1 qemuwrapper -L $D $D${bindir}/fc-cache --sysroot=$D >/dev/null 2>&1
>> +PSEUDO_UNLOAD=1 qemuwrapper -L $D -E LD_LIBRARY_PATH=$D/lib:$D/usr/lib\
>> +					$D${bindir}/fc-cache --sysroot=$D >/dev/null 2>&1
>>  
>>
>> diff --git a/scripts/postinst-intercepts/update_pixbuf_cache b/scripts/postinst-intercepts/update_pixbuf_cache
>> index 9134529..fbb6fd1 100644
>> --- a/scripts/postinst-intercepts/update_pixbuf_cache
>> +++ b/scripts/postinst-intercepts/update_pixbuf_cache
>> @@ -2,7 +2,8 @@
>>  
>>  export GDK_PIXBUF_MODULEDIR=$D${libdir}/gdk-pixbuf-2.0/2.10.0/loaders
>>  
>> -PSEUDO_UNLOAD=1 qemuwrapper -L $D $D${bindir}/gdk-pixbuf-query-loaders \
>> +PSEUDO_UNLOAD=1 qemuwrapper -L $D -E LD_LIBRARY_PATH=$D/lib:$D/usr/lib\
>> +    $D${bindir}/gdk-pixbuf-query-loaders \
>>      >$GDK_PIXBUF_MODULEDIR/../loaders.cache 2>/dev/null && \
>>      sed -i -e "s:$D::g" $GDK_PIXBUF_MODULEDIR/../loaders.cache
>>  
> 
> 



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] postinst-intercepts, qemu.bbclass: fix segfaults in postinstalls
  2013-04-10  7:38   ` Laurentiu Palcu
@ 2013-04-10  8:03     ` Richard Purdie
  0 siblings, 0 replies; 5+ messages in thread
From: Richard Purdie @ 2013-04-10  8:03 UTC (permalink / raw)
  To: Laurentiu Palcu; +Cc: openembedded-core

On Wed, 2013-04-10 at 10:38 +0300, Laurentiu Palcu wrote:
> 
> On 04/10/2013 12:58 AM, Richard Purdie wrote:
> > On Tue, 2013-04-09 at 18:53 +0300, Laurentiu Palcu wrote:
> >> Postinstalls that use qemu are throwing a segmentation fault when
> >> building for qemux86-64 on a 64bit host (it might also happen for
> >> qemux86 if building on a 32bit host but I didn't test). It looks like
> >> qemu looks for ld.so.cache which is not found because it is generated
> >> after rootfs_(rpm|ipk|deb)_do_rootfs is called and then it tries to load
> >> libraries from the default paths (which are the host's). In order to
> >> avoid this, pass the LD_LIBRARY_PATH explicitly to the target's dynamic
> >> loader.
> >>
> >> Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com>
> >> ---
> >>  meta/classes/qemu.bbclass                       |    4 +++-
> >>  scripts/postinst-intercepts/update_font_cache   |    3 ++-
> >>  scripts/postinst-intercepts/update_pixbuf_cache |    3 ++-
> >>  3 files changed, 7 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/meta/classes/qemu.bbclass b/meta/classes/qemu.bbclass
> >> index 0e71d6a..6881826 100644
> >> --- a/meta/classes/qemu.bbclass
> >> +++ b/meta/classes/qemu.bbclass
> >> @@ -29,4 +29,6 @@ def qemu_run_binary(data, rootfs_path, binary):
> >>      if qemu_binary == "qemu-allarch":
> >>          qemu_binary = "qemuwrapper"
> >>  
> >> -    return "PSEUDO_UNLOAD=1 " + qemu_binary + " -L " + rootfs_path + " " + rootfs_path + binary
> >> +    return "PSEUDO_UNLOAD=1 " + qemu_binary + " -L " + rootfs_path\
> >> +            + " -E LD_LIBRARY_PATH=" + rootfs_path + "/lib:" + rootfs_path\
> >> +            + "/usr/lib " + rootfs_path + binary
> > 
> > This isn't going to work with multilibs. Can we reorder the rootfs code
> > so the ld.so.cache piece happens before the intercepts?
> I keep forgetting about multilib... :( I'll find another way.
> Unfortunately, it's not enough to generate ld.so.cache before running
> the intercept hooks because there are other package postinstalls that
> need qemu and those will be run before that. What if, instead of
> hardcoding, we use ${libdir} and ${base_libdir}?. These should always
> point to the right locations even when working with multilib.

With any given binary, you're not going to know which libdir is the
right one though?

Looking at a multilib image, the cache is bust on multilib anyway. In
reality this just makes things slower, it will still work. The source to
ldconfig-native hardcodes LIBDIR/SLIBDIR.

What is the path being used for? Just to find ld.so? Once we get ld.so,
does it provide the right paths from then onwards? If I understand the
changes here, we appear to by bypassing ld.so?

Cheers,

Richard






^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2] postinst-intercepts, qemu.bbclass: fix segfaults in postinstalls
  2013-04-09 15:53 [PATCH] postinst-intercepts, qemu.bbclass: fix segfaults in postinstalls Laurentiu Palcu
  2013-04-09 21:58 ` Richard Purdie
@ 2013-04-10 11:25 ` Laurentiu Palcu
  1 sibling, 0 replies; 5+ messages in thread
From: Laurentiu Palcu @ 2013-04-10 11:25 UTC (permalink / raw)
  To: openembedded-core

Postinstalls that use qemu are throwing a segmentation fault when
building for qemux86-64 on a 64bit host (it might also happen for
qemux86 if building on a 32bit host but I didn't test). It looks like
qemu looks for ld.so.cache which is not found because it is generated
after rootfs_(rpm|ipk|deb)_do_rootfs is called and then it tries to load
libraries from the default paths (which are the host's). In order to
avoid this, pass the LD_LIBRARY_PATH explicitly to the target's dynamic
loader.

Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com>
---
Changes in v2:
 * Addressed Richard's comment about multilib;

 Thanks,
 Laurentiu

 meta/classes/fontcache.bbclass                  |    3 ++-
 meta/classes/gtk-icon-cache.bbclass             |    7 +++++--
 meta/classes/pixbufcache.bbclass                |    3 ++-
 meta/classes/qemu.bbclass                       |    7 ++++++-
 scripts/postinst-intercepts/update_font_cache   |    3 ++-
 scripts/postinst-intercepts/update_pixbuf_cache |    3 ++-
 6 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/meta/classes/fontcache.bbclass b/meta/classes/fontcache.bbclass
index d3c1562..0bc309a 100644
--- a/meta/classes/fontcache.bbclass
+++ b/meta/classes/fontcache.bbclass
@@ -15,7 +15,8 @@ FONT_PACKAGES ??= "${PN}"
 #
 fontcache_common() {
 if [ "x$D" != "x" ] ; then
-	$INTERCEPT_DIR/postinst_intercept update_font_cache ${PKG} bindir=${bindir}
+	$INTERCEPT_DIR/postinst_intercept update_font_cache ${PKG} bindir=${bindir} \
+		libdir=${libdir} base_libdir=${base_libdir}
 	exit 1
 fi
 
diff --git a/meta/classes/gtk-icon-cache.bbclass b/meta/classes/gtk-icon-cache.bbclass
index 6d205a1..b53c0bc 100644
--- a/meta/classes/gtk-icon-cache.bbclass
+++ b/meta/classes/gtk-icon-cache.bbclass
@@ -9,7 +9,8 @@ DEPENDS += "${@['hicolor-icon-theme', '']['${BPN}' == 'hicolor-icon-theme']} gtk
 #
 gtk_icon_cache_postinst() {
 if [ "x$D" != "x" ]; then
-    $INTERCEPT_DIR/postinst_intercept update_icon_cache ${PKG}
+    $INTERCEPT_DIR/postinst_intercept update_icon_cache ${PKG} libdir=${libdir} \
+        base_libdir=${base_libdir}
     exit 1
 fi
 
@@ -25,7 +26,9 @@ done
 
 gtk_icon_cache_postrm() {
 if [ "x$D" != "x" ]; then
-    $INTERCEPT_DIR/postinst_intercept update_icon_cache ${PKG}
+    $INTERCEPT_DIR/postinst_intercept update_icon_cache ${PKG} libdir=${libdir} \
+        base_libdir=${base_libdir}
+
     exit 1
 fi
 
diff --git a/meta/classes/pixbufcache.bbclass b/meta/classes/pixbufcache.bbclass
index fc749de..3c34557 100644
--- a/meta/classes/pixbufcache.bbclass
+++ b/meta/classes/pixbufcache.bbclass
@@ -15,7 +15,8 @@ PIXBUF_PACKAGES ??= "${PN}"
 #
 pixbufcache_common() {
 if [ "x$D" != "x" ]; then
-	$INTERCEPT_DIR/postinst_intercept update_pixbuf_cache ${PKG} libdir=${libdir} bindir=${bindir}
+	$INTERCEPT_DIR/postinst_intercept update_pixbuf_cache ${PKG} libdir=${libdir} \
+		bindir=${bindir} base_libdir=${base_libdir}
 	exit 1
 fi
 
diff --git a/meta/classes/qemu.bbclass b/meta/classes/qemu.bbclass
index 0e71d6a..930c6b0 100644
--- a/meta/classes/qemu.bbclass
+++ b/meta/classes/qemu.bbclass
@@ -29,4 +29,9 @@ def qemu_run_binary(data, rootfs_path, binary):
     if qemu_binary == "qemu-allarch":
         qemu_binary = "qemuwrapper"
 
-    return "PSEUDO_UNLOAD=1 " + qemu_binary + " -L " + rootfs_path + " " + rootfs_path + binary
+    libdir = rootfs_path + data.getVar("libdir", False)
+    base_libdir = rootfs_path + data.getVar("base_libdir", False)
+
+    return "PSEUDO_UNLOAD=1 " + qemu_binary + " -L " + rootfs_path\
+            + " -E LD_LIBRARY_PATH=" + libdir + ":" + base_libdir + " "\
+            + rootfs_path + binary
diff --git a/scripts/postinst-intercepts/update_font_cache b/scripts/postinst-intercepts/update_font_cache
index ad1bab3..afc93d8 100644
--- a/scripts/postinst-intercepts/update_font_cache
+++ b/scripts/postinst-intercepts/update_font_cache
@@ -1,5 +1,6 @@
 #!/bin/sh
 
-PSEUDO_UNLOAD=1 qemuwrapper -L $D $D${bindir}/fc-cache --sysroot=$D >/dev/null 2>&1
+PSEUDO_UNLOAD=1 qemuwrapper -L $D -E LD_LIBRARY_PATH=$D/${libdir}:$D/${base_libdir}\
+					$D${bindir}/fc-cache --sysroot=$D >/dev/null 2>&1
 
 
diff --git a/scripts/postinst-intercepts/update_pixbuf_cache b/scripts/postinst-intercepts/update_pixbuf_cache
index 9134529..bd94fe8 100644
--- a/scripts/postinst-intercepts/update_pixbuf_cache
+++ b/scripts/postinst-intercepts/update_pixbuf_cache
@@ -2,7 +2,8 @@
 
 export GDK_PIXBUF_MODULEDIR=$D${libdir}/gdk-pixbuf-2.0/2.10.0/loaders
 
-PSEUDO_UNLOAD=1 qemuwrapper -L $D $D${bindir}/gdk-pixbuf-query-loaders \
+PSEUDO_UNLOAD=1 qemuwrapper -L $D -E LD_LIBRARY_PATH=$D/${libdir}:$D/${base_libdir}\
+    $D${bindir}/gdk-pixbuf-query-loaders \
     >$GDK_PIXBUF_MODULEDIR/../loaders.cache 2>/dev/null && \
     sed -i -e "s:$D::g" $GDK_PIXBUF_MODULEDIR/../loaders.cache
 
-- 
1.7.9.5




^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-04-10 11:43 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-09 15:53 [PATCH] postinst-intercepts, qemu.bbclass: fix segfaults in postinstalls Laurentiu Palcu
2013-04-09 21:58 ` Richard Purdie
2013-04-10  7:38   ` Laurentiu Palcu
2013-04-10  8:03     ` Richard Purdie
2013-04-10 11:25 ` [PATCH v2] " Laurentiu Palcu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox