Re: [OE-core] [PATCHv2] glibc: Separate out AArch64 multilib loader symlink creation

2019-02-21 Thread Mike Crowe
On Thursday 21 February 2019 at 13:01:27 +, Richard Purdie wrote:
> On Wed, 2019-02-20 at 16:47 +, Mike Crowe wrote:
> > On Wednesday 23 January 2019 at 16:27:59 +, Mike Crowe wrote:
> > > 
> > > Does the lack of response mean that both approaches are horrendous?
> > > If so, do you have any better ideas?
> > 
> > There doesn't seem to be much interest in this one.
> > 
> > The only other idea I've had is to create the symlink at rootfs-creation
> > time. However, that seems to be detaching it too much from glibc, which
> > would cause confusion.
> > 
> > I can apply one of my fixes locally (we currently have some far uglier
> > hacks than these that I'd like to remove), but I'd really rather not have
> > to diverge from upstream this much.
> 
> Sorry for the lack of feedback.
> 
> I'm fairly strongly against a separate aarch64 only recipe for this.
> Realistically we therefore have to fix this in the existing
> class/code/recipe.
> 
> The changes you sent previously didn't look that horrific, did you find
> a working version of that?
> 
> I'm wondering if we can come up with something which works and
> hopefully we can spot some way to then clean it up to be a bit nicer...
> 
> The delay was that I was going to try and come up with something but
> that hasn't happened yet. If you have a horrific non-separate recipe
> version that is complete, we can see if we can do anything to improve
> it.

I had suspected that was the reason for the delay.

I shall knock my modifications to glibc-package.inc into shape and send a
tested patch. I've already improved it a little compared to the version I
sent previously.

Thanks for the response.

Mike.
-- 
___
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core


Re: [OE-core] [PATCHv2] glibc: Separate out AArch64 multilib loader symlink creation

2019-02-21 Thread Richard Purdie
On Wed, 2019-02-20 at 16:47 +, Mike Crowe wrote:
> On Wednesday 23 January 2019 at 16:27:59 +, Mike Crowe wrote:
> > 
> > Does the lack of response mean that both approaches are horrendous?
> > If so, do you have any better ideas?
> 
> There doesn't seem to be much interest in this one.
> 
> The only other idea I've had is to create the symlink at rootfs-creation
> time. However, that seems to be detaching it too much from glibc, which
> would cause confusion.
> 
> I can apply one of my fixes locally (we currently have some far uglier
> hacks than these that I'd like to remove), but I'd really rather not have
> to diverge from upstream this much.

Sorry for the lack of feedback.

I'm fairly strongly against a separate aarch64 only recipe for this.
Realistically we therefore have to fix this in the existing
class/code/recipe.

The changes you sent previously didn't look that horrific, did you find
a working version of that?

I'm wondering if we can come up with something which works and
hopefully we can spot some way to then clean it up to be a bit nicer...

The delay was that I was going to try and come up with something but
that hasn't happened yet. If you have a horrific non-separate recipe
version that is complete, we can see if we can do anything to improve
it.

Cheers,

Richard

-- 
___
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core


Re: [OE-core] [PATCHv2] glibc: Separate out AArch64 multilib loader symlink creation

2019-02-20 Thread Mike Crowe
On Wednesday 23 January 2019 at 16:27:59 +, Mike Crowe wrote:
> On Friday 11 January 2019 at 16:59:44 +, Mike Crowe wrote:
> > On Friday 11 January 2019 at 16:53:47 +, Richard Purdie wrote:
> > > On Fri, 2019-01-11 at 16:49 +, Mike Crowe wrote:
> > > > Until now, glibc was responsible for creating an AArch64 dynamic
> > > > loader symlink if required for ABI compatibility.
> > > > 
> > > > Unfortunately, using multilib with AArch64 caused the rmdir in
> > > > glibc-package.inc:do_poststash_install_cleanup to fail because that
> > > > task did not expect to find the dynamic loader symlink in /lib.
> > > > 
> > > > Also, although glibc-package.inc:do_install_append_aarch64 made use
> > > > of ${nonarch_base_libdir} to create the dynamic loader symlink in a
> > > > way that was compatible with usrmerge, it unfortunately explicitly
> > > > added only /lib to libc_baselibs, so the symlink was not packaged
> > > > correctly when using usrmerge.
> > > > 
> > > > Attempting to fix both of these problems within glibc-package.inc in
> > > > various ways created a bit of a mess. It seemed much simpler to
> > > > invent a new package for the symlink and have glibc RDEPEND on that
> > > > package if required.
> > > > 
> > > > Richard Purdie suggested[1] that ${nonarch_base_libdir} should not be
> > > > used in this way. I've switched to using ${root_prefix}/lib which
> > > > continues to work both with and without usrmerge.
> > > > 
> > > > Unfortunately, it appears not to be possible to specify the name of
> > > > the loader via a variable with an override, since the _aarch64
> > > > override is applied even for _aarch64-be.
> > > 
> > > I wish there was a simpler way to do this. How ugly is the patch to fix
> > > this without adding the new recipe? Adding new recipes which are arch
> > > specific like this is a pain for world builds and I think this patch
> > > will have problems with those :(.
> > 
> > This is how far I got before deciding that it was too ugly. This patch
> > needs some cleaning up, and similar hackery to the separate-recipe patch
> > because the aarch64-be override doesn't work. :(
> > 
> > I tried to make both patches at least slightly generic in case some other
> > architecture needs something similar in the future. That's why the code has
> > moved into a plain do_install_append. This isn't required though, and
> > perhaps it would be clearer if the variable were actually
> > AARCH64_DYNAMIC_LOADER anyway.
> > 
> > Thanks.
> > 
> > Mike.
> > 
> > diff --git a/meta/recipes-core/glibc/glibc-package.inc 
> > b/meta/recipes-core/glibc/glibc-package.inc
> > index a98ae1a29c..0181aa7b32 100644
> > --- a/meta/recipes-core/glibc/glibc-package.inc
> > +++ b/meta/recipes-core/glibc/glibc-package.inc
> > @@ -15,7 +15,13 @@ RPROVIDES_glibc-thread-db = "eglibc-thread-db"
> >  RPROVIDES_${PN}-pcprofile = "eglibc-pcprofile"
> >  RPROVIDES_${PN}-dbg = "eglibc-dbg"
> >  libc_baselibs = "${base_libdir}/libc.so.* ${base_libdir}/libc-*.so 
> > ${base_libdir}/libm*.so.* ${base_libdir}/libm-*.so 
> > ${base_libdir}/libmvec-*.so ${base_libdir}/ld*.so.* ${base_libdir}/ld-*.so 
> > ${base_libdir}/libpthread*.so.* ${base_libdir}/libpthread-*.so 
> > ${base_libdir}/libresolv*.so.* ${base_libdir}/libresolv-*.so 
> > ${base_libdir}/librt*.so.* ${base_libdir}/librt-*.so 
> > ${base_libdir}/libutil*.so.* ${base_libdir}/libutil-*.so 
> > ${base_libdir}/libnsl*.so.* ${base_libdir}/libnsl-*.so 
> > ${base_libdir}/libnss_files*.so.* ${base_libdir}/libnss_files-*.so 
> > ${base_libdir}/libnss_compat*.so.* ${base_libdir}/libnss_compat-*.so 
> > ${base_libdir}/libnss_dns*.so.* ${base_libdir}/libnss_dns-*.so 
> > ${base_libdir}/libdl*.so.* ${base_libdir}/libdl-*.so 
> > ${base_libdir}/libanl*.so.* ${base_libdir}/libanl-*.so 
> > ${base_libdir}/libBrokenLocale*.so.* ${base_libdir}/libBrokenLocale-*.so"
> > -libc_baselibs_append_aarch64 = " /lib/ld-linux-aarch64*.so.1"
> > +ARCH_DYNAMIC_LOADER = ""
> > +# The aarch64 ABI says the dynamic linker -must- be
> > +# /lib/ld-linux-aarch64[_be].so.1. With usrmerge, that may mean that
> > +# we need to install it in /usr/lib.
> > +ARCH_DYNAMIC_LOADER_aarch64 = "ld-linux-aarch64.so.1"
> > +ARCH_DYNAMIC_LOADER_aarch64_be = "ld-linux-aarch64_be.so.1"
> > +libc_baselibs_append = " ${@oe.utils.conditional('ARCH_DYNAMIC_LOADER', 
> > '', '', '${root_prefix}/lib/${ARCH_DYNAMIC_LOADER}', d)}"
> >  INSANE_SKIP_${PN}_append_aarch64 = " libdir"
> > 
> >  FILES_${PN} = "${libc_baselibs} ${libexecdir}/* ${base_sbindir}/ldconfig 
> > ${sysconfdir}/ld.so.conf"
> > @@ -112,20 +118,20 @@ do_install_append () {
> > echo "d root root 0755 /var/run/nscd none" \
> > > ${D}${sysconfdir}/default/volatiles/98_nscd
> > fi
> > +
> > +   # The dynamic loader will have been installed into
> > +   # ${base_libdir}. However, if that isn't going to end up being
> > +   # available in the ABI-mandated location, then a symlink must
> > +# be created.
> > +
> > +   

Re: [OE-core] [PATCHv2] glibc: Separate out AArch64 multilib loader symlink creation

2019-01-23 Thread Mike Crowe
On Friday 11 January 2019 at 16:59:44 +, Mike Crowe wrote:
> On Friday 11 January 2019 at 16:53:47 +, Richard Purdie wrote:
> > On Fri, 2019-01-11 at 16:49 +, Mike Crowe wrote:
> > > Until now, glibc was responsible for creating an AArch64 dynamic
> > > loader symlink if required for ABI compatibility.
> > > 
> > > Unfortunately, using multilib with AArch64 caused the rmdir in
> > > glibc-package.inc:do_poststash_install_cleanup to fail because that
> > > task did not expect to find the dynamic loader symlink in /lib.
> > > 
> > > Also, although glibc-package.inc:do_install_append_aarch64 made use
> > > of ${nonarch_base_libdir} to create the dynamic loader symlink in a
> > > way that was compatible with usrmerge, it unfortunately explicitly
> > > added only /lib to libc_baselibs, so the symlink was not packaged
> > > correctly when using usrmerge.
> > > 
> > > Attempting to fix both of these problems within glibc-package.inc in
> > > various ways created a bit of a mess. It seemed much simpler to
> > > invent a new package for the symlink and have glibc RDEPEND on that
> > > package if required.
> > > 
> > > Richard Purdie suggested[1] that ${nonarch_base_libdir} should not be
> > > used in this way. I've switched to using ${root_prefix}/lib which
> > > continues to work both with and without usrmerge.
> > > 
> > > Unfortunately, it appears not to be possible to specify the name of
> > > the loader via a variable with an override, since the _aarch64
> > > override is applied even for _aarch64-be.
> > 
> > I wish there was a simpler way to do this. How ugly is the patch to fix
> > this without adding the new recipe? Adding new recipes which are arch
> > specific like this is a pain for world builds and I think this patch
> > will have problems with those :(.
> 
> This is how far I got before deciding that it was too ugly. This patch
> needs some cleaning up, and similar hackery to the separate-recipe patch
> because the aarch64-be override doesn't work. :(
> 
> I tried to make both patches at least slightly generic in case some other
> architecture needs something similar in the future. That's why the code has
> moved into a plain do_install_append. This isn't required though, and
> perhaps it would be clearer if the variable were actually
> AARCH64_DYNAMIC_LOADER anyway.
> 
> Thanks.
> 
> Mike.
> 
> diff --git a/meta/recipes-core/glibc/glibc-package.inc 
> b/meta/recipes-core/glibc/glibc-package.inc
> index a98ae1a29c..0181aa7b32 100644
> --- a/meta/recipes-core/glibc/glibc-package.inc
> +++ b/meta/recipes-core/glibc/glibc-package.inc
> @@ -15,7 +15,13 @@ RPROVIDES_glibc-thread-db = "eglibc-thread-db"
>  RPROVIDES_${PN}-pcprofile = "eglibc-pcprofile"
>  RPROVIDES_${PN}-dbg = "eglibc-dbg"
>  libc_baselibs = "${base_libdir}/libc.so.* ${base_libdir}/libc-*.so 
> ${base_libdir}/libm*.so.* ${base_libdir}/libm-*.so 
> ${base_libdir}/libmvec-*.so ${base_libdir}/ld*.so.* ${base_libdir}/ld-*.so 
> ${base_libdir}/libpthread*.so.* ${base_libdir}/libpthread-*.so 
> ${base_libdir}/libresolv*.so.* ${base_libdir}/libresolv-*.so 
> ${base_libdir}/librt*.so.* ${base_libdir}/librt-*.so 
> ${base_libdir}/libutil*.so.* ${base_libdir}/libutil-*.so 
> ${base_libdir}/libnsl*.so.* ${base_libdir}/libnsl-*.so 
> ${base_libdir}/libnss_files*.so.* ${base_libdir}/libnss_files-*.so 
> ${base_libdir}/libnss_compat*.so.* ${base_libdir}/libnss_compat-*.so 
> ${base_libdir}/libnss_dns*.so.* ${base_libdir}/libnss_dns-*.so 
> ${base_libdir}/libdl*.so.* ${base_libdir}/libdl-*.so 
> ${base_libdir}/libanl*.so.* ${base_libdir}/libanl-*.so 
> ${base_libdir}/libBrokenLocale*.so.* ${base_libdir}/libBrokenLocale-*.so"
> -libc_baselibs_append_aarch64 = " /lib/ld-linux-aarch64*.so.1"
> +ARCH_DYNAMIC_LOADER = ""
> +# The aarch64 ABI says the dynamic linker -must- be
> +# /lib/ld-linux-aarch64[_be].so.1. With usrmerge, that may mean that
> +# we need to install it in /usr/lib.
> +ARCH_DYNAMIC_LOADER_aarch64 = "ld-linux-aarch64.so.1"
> +ARCH_DYNAMIC_LOADER_aarch64_be = "ld-linux-aarch64_be.so.1"
> +libc_baselibs_append = " ${@oe.utils.conditional('ARCH_DYNAMIC_LOADER', '', 
> '', '${root_prefix}/lib/${ARCH_DYNAMIC_LOADER}', d)}"
>  INSANE_SKIP_${PN}_append_aarch64 = " libdir"
> 
>  FILES_${PN} = "${libc_baselibs} ${libexecdir}/* ${base_sbindir}/ldconfig 
> ${sysconfdir}/ld.so.conf"
> @@ -112,20 +118,20 @@ do_install_append () {
>   echo "d root root 0755 /var/run/nscd none" \
>   > ${D}${sysconfdir}/default/volatiles/98_nscd
>   fi
> +
> + # The dynamic loader will have been installed into
> + # ${base_libdir}. However, if that isn't going to end up being
> + # available in the ABI-mandated location, then a symlink must
> +# be created.
> +
> + if [ -n "${ARCH_DYNAMIC_LOADER}" -a ! -e 
> "${D}${root_prefix}/lib/${ARCH_DYNAMIC_LOADER}" ]; then
> + install -d ${D}${root_prefix}/lib
> + ln -s ${@oe.path.relative('${root_prefix}/lib', 
> 

Re: [OE-core] [PATCHv2] glibc: Separate out AArch64 multilib loader symlink creation

2019-01-11 Thread Mike Crowe
On Friday 11 January 2019 at 16:53:47 +, Richard Purdie wrote:
> On Fri, 2019-01-11 at 16:49 +, Mike Crowe wrote:
> > Until now, glibc was responsible for creating an AArch64 dynamic
> > loader symlink if required for ABI compatibility.
> > 
> > Unfortunately, using multilib with AArch64 caused the rmdir in
> > glibc-package.inc:do_poststash_install_cleanup to fail because that
> > task did not expect to find the dynamic loader symlink in /lib.
> > 
> > Also, although glibc-package.inc:do_install_append_aarch64 made use
> > of ${nonarch_base_libdir} to create the dynamic loader symlink in a
> > way that was compatible with usrmerge, it unfortunately explicitly
> > added only /lib to libc_baselibs, so the symlink was not packaged
> > correctly when using usrmerge.
> > 
> > Attempting to fix both of these problems within glibc-package.inc in
> > various ways created a bit of a mess. It seemed much simpler to
> > invent a new package for the symlink and have glibc RDEPEND on that
> > package if required.
> > 
> > Richard Purdie suggested[1] that ${nonarch_base_libdir} should not be
> > used in this way. I've switched to using ${root_prefix}/lib which
> > continues to work both with and without usrmerge.
> > 
> > Unfortunately, it appears not to be possible to specify the name of
> > the loader via a variable with an override, since the _aarch64
> > override is applied even for _aarch64-be.
> 
> I wish there was a simpler way to do this. How ugly is the patch to fix
> this without adding the new recipe? Adding new recipes which are arch
> specific like this is a pain for world builds and I think this patch
> will have problems with those :(.

This is how far I got before deciding that it was too ugly. This patch
needs some cleaning up, and similar hackery to the separate-recipe patch
because the aarch64-be override doesn't work. :(

I tried to make both patches at least slightly generic in case some other
architecture needs something similar in the future. That's why the code has
moved into a plain do_install_append. This isn't required though, and
perhaps it would be clearer if the variable were actually
AARCH64_DYNAMIC_LOADER anyway.

Thanks.

Mike.

diff --git a/meta/recipes-core/glibc/glibc-package.inc 
b/meta/recipes-core/glibc/glibc-package.inc
index a98ae1a29c..0181aa7b32 100644
--- a/meta/recipes-core/glibc/glibc-package.inc
+++ b/meta/recipes-core/glibc/glibc-package.inc
@@ -15,7 +15,13 @@ RPROVIDES_glibc-thread-db = "eglibc-thread-db"
 RPROVIDES_${PN}-pcprofile = "eglibc-pcprofile"
 RPROVIDES_${PN}-dbg = "eglibc-dbg"
 libc_baselibs = "${base_libdir}/libc.so.* ${base_libdir}/libc-*.so 
${base_libdir}/libm*.so.* ${base_libdir}/libm-*.so ${base_libdir}/libmvec-*.so 
${base_libdir}/ld*.so.* ${base_libdir}/ld-*.so ${base_libdir}/libpthread*.so.* 
${base_libdir}/libpthread-*.so ${base_libdir}/libresolv*.so.* 
${base_libdir}/libresolv-*.so ${base_libdir}/librt*.so.* 
${base_libdir}/librt-*.so ${base_libdir}/libutil*.so.* 
${base_libdir}/libutil-*.so ${base_libdir}/libnsl*.so.* 
${base_libdir}/libnsl-*.so ${base_libdir}/libnss_files*.so.* 
${base_libdir}/libnss_files-*.so ${base_libdir}/libnss_compat*.so.* 
${base_libdir}/libnss_compat-*.so ${base_libdir}/libnss_dns*.so.* 
${base_libdir}/libnss_dns-*.so ${base_libdir}/libdl*.so.* 
${base_libdir}/libdl-*.so ${base_libdir}/libanl*.so.* 
${base_libdir}/libanl-*.so ${base_libdir}/libBrokenLocale*.so.* 
${base_libdir}/libBrokenLocale-*.so"
-libc_baselibs_append_aarch64 = " /lib/ld-linux-aarch64*.so.1"
+ARCH_DYNAMIC_LOADER = ""
+# The aarch64 ABI says the dynamic linker -must- be
+# /lib/ld-linux-aarch64[_be].so.1. With usrmerge, that may mean that
+# we need to install it in /usr/lib.
+ARCH_DYNAMIC_LOADER_aarch64 = "ld-linux-aarch64.so.1"
+ARCH_DYNAMIC_LOADER_aarch64_be = "ld-linux-aarch64_be.so.1"
+libc_baselibs_append = " ${@oe.utils.conditional('ARCH_DYNAMIC_LOADER', '', 
'', '${root_prefix}/lib/${ARCH_DYNAMIC_LOADER}', d)}"
 INSANE_SKIP_${PN}_append_aarch64 = " libdir"

 FILES_${PN} = "${libc_baselibs} ${libexecdir}/* ${base_sbindir}/ldconfig 
${sysconfdir}/ld.so.conf"
@@ -112,20 +118,20 @@ do_install_append () {
echo "d root root 0755 /var/run/nscd none" \
> ${D}${sysconfdir}/default/volatiles/98_nscd
fi
+
+   # The dynamic loader will have been installed into
+   # ${base_libdir}. However, if that isn't going to end up being
+   # available in the ABI-mandated location, then a symlink must
+# be created.
+
+   if [ -n "${ARCH_DYNAMIC_LOADER}" -a ! -e 
"${D}${root_prefix}/lib/${ARCH_DYNAMIC_LOADER}" ]; then
+   install -d ${D}${root_prefix}/lib
+   ln -s ${@oe.path.relative('${root_prefix}/lib', 
'${base_libdir}')}/${ARCH_DYNAMIC_LOADER} \
+   ${D}${root_prefix}/lib/${ARCH_DYNAMIC_LOADER}
+   fi
 }

 do_install_append_aarch64 () {
-   if [ "${base_libdir}" != "${nonarch_base_libdir}" ]; then
-   # The 

Re: [OE-core] [PATCHv2] glibc: Separate out AArch64 multilib loader symlink creation

2019-01-11 Thread Richard Purdie
On Fri, 2019-01-11 at 16:49 +, Mike Crowe wrote:
> Until now, glibc was responsible for creating an AArch64 dynamic
> loader symlink if required for ABI compatibility.
> 
> Unfortunately, using multilib with AArch64 caused the rmdir in
> glibc-package.inc:do_poststash_install_cleanup to fail because that
> task did not expect to find the dynamic loader symlink in /lib.
> 
> Also, although glibc-package.inc:do_install_append_aarch64 made use
> of ${nonarch_base_libdir} to create the dynamic loader symlink in a
> way that was compatible with usrmerge, it unfortunately explicitly
> added only /lib to libc_baselibs, so the symlink was not packaged
> correctly when using usrmerge.
> 
> Attempting to fix both of these problems within glibc-package.inc in
> various ways created a bit of a mess. It seemed much simpler to
> invent a new package for the symlink and have glibc RDEPEND on that
> package if required.
> 
> Richard Purdie suggested[1] that ${nonarch_base_libdir} should not be
> used in this way. I've switched to using ${root_prefix}/lib which
> continues to work both with and without usrmerge.
> 
> Unfortunately, it appears not to be possible to specify the name of
> the loader via a variable with an override, since the _aarch64
> override is applied even for _aarch64-be.

I wish there was a simpler way to do this. How ugly is the patch to fix
this without adding the new recipe? Adding new recipes which are arch
specific like this is a pain for world builds and I think this patch
will have problems with those :(.

Cheers,

Richard

-- 
___
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core


[OE-core] [PATCHv2] glibc: Separate out AArch64 multilib loader symlink creation

2019-01-11 Thread Mike Crowe
Until now, glibc was responsible for creating an AArch64 dynamic loader
symlink if required for ABI compatibility.

Unfortunately, using multilib with AArch64 caused the rmdir in
glibc-package.inc:do_poststash_install_cleanup to fail because that task
did not expect to find the dynamic loader symlink in /lib.

Also, although glibc-package.inc:do_install_append_aarch64 made use of
${nonarch_base_libdir} to create the dynamic loader symlink in a way that
was compatible with usrmerge, it unfortunately explicitly added only /lib
to libc_baselibs, so the symlink was not packaged correctly when using
usrmerge.

Attempting to fix both of these problems within glibc-package.inc in
various ways created a bit of a mess. It seemed much simpler to invent a
new package for the symlink and have glibc RDEPEND on that package if
required.

Richard Purdie suggested[1] that ${nonarch_base_libdir} should not be used
in this way. I've switched to using ${root_prefix}/lib which continues to
work both with and without usrmerge.

Unfortunately, it appears not to be possible to specify the name of the
loader via a variable with an override, since the _aarch64 override is
applied even for _aarch64-be.

Build-tested and inspected core-image-minimal rootfs with:

* AArch64 no multilib (real loader in correct place)
 MACHINE = "qemuarm64"

* AArch64 multilib (symlink in correct place)
 MACHINE = "qemuarm64"
 MULTILIBS = "multilib:lib32"
 DEFAULTTUNE_virtclass-multilib-lib32 = "armv7at-neon"
 require conf/multilib.conf

* AArch64 usrmerge (real loader in correct place)
 DISTRO_FEATURES += "usrmerge"
 MACHINE = "qemuarm64"

* AArch64 multilib usrmerge (symlink in correct place)
 DISTRO_FEATURES += "usrmerge"
 MACHINE = "qemuarm64"
 MULTILIBS = "multilib:lib32"
 DEFAULTTUNE_virtclass-multilib-lib32 = "armv7at-neon"
 require conf/multilib.conf

* AArch64 big-endian multilib usrmerge (symlink in correct place)
 DEFAULTTUNE = "aarch64_be"
 DISTRO_FEATURES += "usrmerge"
 MACHINE = "qemuarm64"
 MULTILIBS = "multilib:lib32"
 DEFAULTTUNE_virtclass-multilib-lib32 = "armv7at-neon"
 require conf/multilib.conf

* x86 (real loader in correct place)
 MACHINE = "qemux86"

[1] 
http://lists.openembedded.org/pipermail/openembedded-core/2018-November/276120.html

Signed-off-by: Mike Crowe 
---
 .../glibc/glibc-loader-symlink.bb | 27 +++
 meta/recipes-core/glibc/glibc-package.inc | 20 +-
 2 files changed, 34 insertions(+), 13 deletions(-)
 create mode 100644 meta/recipes-core/glibc/glibc-loader-symlink.bb

diff --git a/meta/recipes-core/glibc/glibc-loader-symlink.bb 
b/meta/recipes-core/glibc/glibc-loader-symlink.bb
new file mode 100644
index 00..737d23f0d1
--- /dev/null
+++ b/meta/recipes-core/glibc/glibc-loader-symlink.bb
@@ -0,0 +1,27 @@
+# On AArch64, at least glibc will RDEPEND on this recipe in order to
+# ensure that the dynamic loader is available in the ABI-mandated
+# location when that location differs from where glibc installed it.
+# This happens when multilib is enabled.
+
+SUMMARY = "AArch64 compatibility symlink when using multilib"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = 
"file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
+
+INSANE_SKIP_${PN}_append_aarch64 = " libdir"
+FILES_${PN} = "${root_prefix}/lib"
+
+do_install_aarch64() {
+if [ "${base_libdir}" != "${root_prefix}/lib" ]; then
+# The aarch64 ABI says the dynamic linker -must- be 
/lib/ld-linux-aarch64[_be].so.1
+install -d ${D}${root_prefix}/lib
+if [ "${ARMPKGARCH}" = "aarch64" ]; then
+ln -s ${@oe.path.relative('${root_prefix}/lib', 
'${base_libdir}')}/ld-linux-aarch64.so.1 \
+  ${D}${root_prefix}/lib/ld-linux-aarch64.so.1
+elif [ "${ARMPKGARCH}" = "aarch64_be" ]; then
+ln -s ${@oe.path.relative('${root_prefix}/lib', 
'${base_libdir}')}/ld-linux-aarch64_be.so.1 \
+  ${D}${root_prefix}/lib/ld-linux-aarch64_be.so.1
+else
+false
+fi
+fi
+}
diff --git a/meta/recipes-core/glibc/glibc-package.inc 
b/meta/recipes-core/glibc/glibc-package.inc
index a98ae1a29c..9c3f5bc355 100644
--- a/meta/recipes-core/glibc/glibc-package.inc
+++ b/meta/recipes-core/glibc/glibc-package.inc
@@ -15,8 +15,6 @@ RPROVIDES_glibc-thread-db = "eglibc-thread-db"
 RPROVIDES_${PN}-pcprofile = "eglibc-pcprofile"
 RPROVIDES_${PN}-dbg = "eglibc-dbg"
 libc_baselibs = "${base_libdir}/libc.so.* ${base_libdir}/libc-*.so 
${base_libdir}/libm*.so.* ${base_libdir}/libm-*.so ${base_libdir}/libmvec-*.so 
${base_libdir}/ld*.so.* ${base_libdir}/ld-*.so ${base_libdir}/libpthread*.so.* 
${base_libdir}/libpthread-*.so ${base_libdir}/libresolv*.so.* 
${base_libdir}/libresolv-*.so ${base_libdir}/librt*.so.* 
${base_libdir}/librt-*.so ${base_libdir}/libutil*.so.* 
${base_libdir}/libutil-*.so ${base_libdir}/libnsl*.so.* 
${base_libdir}/libnsl-*.so ${base_libdir}/libnss_files*.so.* 
${base_libdir}/libnss_files-*.so