Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH] NeededEntry: don't use scanelf -q (bug 721336)
Date: Sat, 09 May 2020 22:17:33
Message-Id: 20200509221711.26744-1-zmedico@gentoo.org
1 We don't use scanelf -q, since that would omit libraries like
2 musl's /usr/lib/libc.so which do not have any DT_NEEDED or
3 DT_SONAME settings. Since we don't use scanelf -q, we have to
4 handle the special rpath value " - ".
5
6 Bug: https://bugs.gentoo.org/721336
7 Fixes: 25fbe7bc1a92 ("NeededEntry: infer implicit soname from file basename (bug 715162)")
8 Signed-off-by: Zac Medico <zmedico@g.o>
9 ---
10 bin/misc-functions.sh | 6 +++++-
11 lib/portage/util/_dyn_libs/LinkageMapELF.py | 5 ++++-
12 lib/portage/util/_dyn_libs/NeededEntry.py | 5 +++++
13 3 files changed, 14 insertions(+), 2 deletions(-)
14
15 diff --git a/bin/misc-functions.sh b/bin/misc-functions.sh
16 index 9efe99b87..c2a16cbe0 100755
17 --- a/bin/misc-functions.sh
18 +++ b/bin/misc-functions.sh
19 @@ -177,7 +177,11 @@ install_qa_check() {
20 if type -P scanelf > /dev/null ; then
21 # Save NEEDED information after removing self-contained providers
22 rm -f "$PORTAGE_BUILDDIR"/build-info/NEEDED{,.ELF.2}
23 - scanelf -qyRF '%a;%p;%S;%r;%n' "${D%/}/" | { while IFS= read -r l; do
24 + # We don't use scanelf -q, since that would omit libraries like
25 + # musl's /usr/lib/libc.so which do not have any DT_NEEDED or
26 + # DT_SONAME settings. Since we don't use scanelf -q, we have to
27 + # handle the special rpath value " - " below.
28 + scanelf -yRBF '%a;%p;%S;%r;%n' "${D%/}/" | { while IFS= read -r l; do
29 arch=${l%%;*}; l=${l#*;}
30 obj="/${l%%;*}"; l=${l#*;}
31 soname=${l%%;*}; l=${l#*;}
32 diff --git a/lib/portage/util/_dyn_libs/LinkageMapELF.py b/lib/portage/util/_dyn_libs/LinkageMapELF.py
33 index 2d4929445..473a1243d 100644
34 --- a/lib/portage/util/_dyn_libs/LinkageMapELF.py
35 +++ b/lib/portage/util/_dyn_libs/LinkageMapELF.py
36 @@ -272,7 +272,10 @@ class LinkageMapELF(object):
37 continue
38 plibs.update((x, cpv) for x in items)
39 if plibs:
40 - args = [os.path.join(EPREFIX or "/", "usr/bin/scanelf"), "-qF", "%a;%F;%S;%r;%n"]
41 + # We don't use scanelf -q, since that would omit libraries like
42 + # musl's /usr/lib/libc.so which do not have any DT_NEEDED or
43 + # DT_SONAME settings.
44 + args = [os.path.join(EPREFIX or "/", "usr/bin/scanelf"), "-BF", "%a;%F;%S;%r;%n"]
45 args.extend(os.path.join(root, x.lstrip("." + os.sep)) \
46 for x in plibs)
47 try:
48 diff --git a/lib/portage/util/_dyn_libs/NeededEntry.py b/lib/portage/util/_dyn_libs/NeededEntry.py
49 index c52cfce3c..70ff99100 100644
50 --- a/lib/portage/util/_dyn_libs/NeededEntry.py
51 +++ b/lib/portage/util/_dyn_libs/NeededEntry.py
52 @@ -52,6 +52,11 @@ class NeededEntry(object):
53
54 del fields[cls._MIN_FIELDS:]
55 obj.arch, obj.filename, obj.soname, rpaths, needed = fields
56 + # We don't use scanelf -q, since that would omit libraries like
57 + # musl's /usr/lib/libc.so which do not have any DT_NEEDED or
58 + # DT_SONAME settings. Since we don't use scanelf -q, we have to
59 + # handle the special rpath value " - " below.
60 + rpaths = "" if rpaths == " - " else rpaths
61 obj.runpaths = tuple(filter(None, rpaths.split(":")))
62 obj.needed = tuple(filter(None, needed.split(",")))
63
64 --
65 2.25.3