We don't use scanelf -q, since that would omit libraries like
musl's /usr/lib/libc.so which do not have any DT_NEEDED or
DT_SONAME settings. Since we don't use scanelf -q, we have to
handle the special rpath value "  -  ".

Bug: https://bugs.gentoo.org/721336
Fixes: 25fbe7bc1a92 ("NeededEntry: infer implicit soname from file basename 
(bug 715162)")
Signed-off-by: Zac Medico <zmed...@gentoo.org>
---
 bin/misc-functions.sh                       | 6 +++++-
 lib/portage/util/_dyn_libs/LinkageMapELF.py | 5 ++++-
 lib/portage/util/_dyn_libs/NeededEntry.py   | 5 +++++
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/bin/misc-functions.sh b/bin/misc-functions.sh
index 9efe99b87..c2a16cbe0 100755
--- a/bin/misc-functions.sh
+++ b/bin/misc-functions.sh
@@ -177,7 +177,11 @@ install_qa_check() {
        if type -P scanelf > /dev/null ; then
                # Save NEEDED information after removing self-contained 
providers
                rm -f "$PORTAGE_BUILDDIR"/build-info/NEEDED{,.ELF.2}
-               scanelf -qyRF '%a;%p;%S;%r;%n' "${D%/}/" | { while IFS= read -r 
l; do
+               # We don't use scanelf -q, since that would omit libraries like
+               # musl's /usr/lib/libc.so which do not have any DT_NEEDED or
+               # DT_SONAME settings. Since we don't use scanelf -q, we have to
+               # handle the special rpath value "  -  " below.
+               scanelf -yRBF '%a;%p;%S;%r;%n' "${D%/}/" | { while IFS= read -r 
l; do
                        arch=${l%%;*}; l=${l#*;}
                        obj="/${l%%;*}"; l=${l#*;}
                        soname=${l%%;*}; l=${l#*;}
diff --git a/lib/portage/util/_dyn_libs/LinkageMapELF.py 
b/lib/portage/util/_dyn_libs/LinkageMapELF.py
index 2d4929445..473a1243d 100644
--- a/lib/portage/util/_dyn_libs/LinkageMapELF.py
+++ b/lib/portage/util/_dyn_libs/LinkageMapELF.py
@@ -272,7 +272,10 @@ class LinkageMapELF(object):
                                        continue
                                plibs.update((x, cpv) for x in items)
                if plibs:
-                       args = [os.path.join(EPREFIX or "/", 
"usr/bin/scanelf"), "-qF", "%a;%F;%S;%r;%n"]
+                       # We don't use scanelf -q, since that would omit 
libraries like
+                       # musl's /usr/lib/libc.so which do not have any 
DT_NEEDED or
+                       # DT_SONAME settings.
+                       args = [os.path.join(EPREFIX or "/", 
"usr/bin/scanelf"), "-BF", "%a;%F;%S;%r;%n"]
                        args.extend(os.path.join(root, x.lstrip("." + os.sep)) \
                                for x in plibs)
                        try:
diff --git a/lib/portage/util/_dyn_libs/NeededEntry.py 
b/lib/portage/util/_dyn_libs/NeededEntry.py
index c52cfce3c..70ff99100 100644
--- a/lib/portage/util/_dyn_libs/NeededEntry.py
+++ b/lib/portage/util/_dyn_libs/NeededEntry.py
@@ -52,6 +52,11 @@ class NeededEntry(object):
 
                del fields[cls._MIN_FIELDS:]
                obj.arch, obj.filename, obj.soname, rpaths, needed = fields
+               # We don't use scanelf -q, since that would omit libraries like
+               # musl's /usr/lib/libc.so which do not have any DT_NEEDED or
+               # DT_SONAME settings. Since we don't use scanelf -q, we have to
+               # handle the special rpath value "  -  " below.
+               rpaths = "" if rpaths == "  -  " else rpaths
                obj.runpaths = tuple(filter(None, rpaths.split(":")))
                obj.needed = tuple(filter(None, needed.split(",")))
 
-- 
2.25.3


Reply via email to