On Mon, 26 Dec 2016 20:37:39 -0800 Zac Medico <zmed...@gentoo.org> wrote:
> When support for parsing ELF headers in order to compute multilib > category was added in commit f1c1b8a77eebf7713b32e5f9945690f60f4f46de, > the LinkageMapELF class was not updated to do the same for preserved > libraries. This has resulted in incorrect preserve-libs handling > as reported in bug 598080, for ABIs including x32 where the > _approx_multilib_categories mapping is insufficient. This patch fixes > LinkageMapELF to compute the multilib category for each preserved > library, in the same way as the _post_src_install_soname_symlinks > function, so that the LinkageMapELF.findConsumers method will operate > correctly with preserved libraries of all ABIs. > > Fixes: f1c1b8a77eeb ("Generate soname dependency metadata (bug > 282639)") X-Gentoo-bug: 598080 > X-Gentoo-bug-url: https://bugs.gentoo.org/598080 > --- > pym/portage/util/_dyn_libs/LinkageMapELF.py | 33 > +++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 7 > deletions(-) > > diff --git a/pym/portage/util/_dyn_libs/LinkageMapELF.py > b/pym/portage/util/_dyn_libs/LinkageMapELF.py index 0b09fe5..a063621 > 100644 --- a/pym/portage/util/_dyn_libs/LinkageMapELF.py > +++ b/pym/portage/util/_dyn_libs/LinkageMapELF.py > @@ -4,6 +4,7 @@ > import errno > import logging > import subprocess > +import sys > > import portage > from portage import _encodings > @@ -12,6 +13,7 @@ from portage import _unicode_decode > from portage import _unicode_encode > from portage.cache.mappings import slot_dict_class > from portage.const import EPREFIX > +from portage.dep.soname.multilib_category import > compute_multilib_category from portage.exception import > CommandNotFound, InvalidData from portage.localization import _ > from portage.util import getlibpaths > @@ -20,6 +22,12 @@ from portage.util import normalize_path > from portage.util import varexpand > from portage.util import writemsg_level > from portage.util._dyn_libs.NeededEntry import NeededEntry > +from portage.util.elf.header import ELFHeader > + > +if sys.hexversion >= 0x3000000: > + _unicode = str > +else: > + _unicode = unicode > > # Map ELF e_machine values from NEEDED.ELF.2 to approximate multilib > # categories. This approximation will produce incorrect results on > x32 @@ -283,15 +291,26 @@ class LinkageMapELF(object): > l = l[3:].rstrip("\n") > if not l: > continue > - fields = l.split(";") > - if len(fields) < 5: > - > writemsg_level(_("\nWrong number of fields " \ > - "returned > from scanelf: %s\n\n") % (l,), > + try: > + entry = > NeededEntry.parse("scanelf", l) > + except InvalidData as e: > + > writemsg_level("\n%s\n\n" % (e,), level=logging.ERROR, noiselevel=-1) > continue > - fields[1] = > fields[1][root_len:] > - owner = plibs.pop(fields[1], > None) > - lines.append((owner, > "scanelf", ";".join(fields))) > + try: > + with > open(_unicode_encode(entry.filename, > + > encoding=_encodings['fs'], > + > errors='strict'), 'rb') as f: > + elf_header = > ELFHeader.read(f) > + except EnvironmentError as e: > + if e.errno != > errno.ENOENT: > + raise > + # File removed > concurrently. > + continue > + entry.multilib_category = > compute_multilib_category(elf_header) > + entry.filename = > entry.filename[root_len:] > + owner = > plibs.pop(entry.filename, None) > + lines.append((owner, > "scanelf", _unicode(entry))) proc.wait() > proc.stdout.close() > looks fine -- Brian Dolbec <dolsen>