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 |