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>


Reply via email to