Re: [gentoo-portage-dev] [PATCH] LinkageMapELF: compute mulilib category for preserved libs (bug 598080)

2016-12-27 Thread Zac Medico
On 12/27/2016 01:23 PM, Brian Dolbec wrote:
> On Mon, 26 Dec 2016 20:37:39 -0800
> Zac Medico  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 >= 0x300:
>> +_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
> 

Thanks, pushed:

https://gitweb.gentoo.org/proj/portage.git/commit/?id=cbaee3c3b28f52947c142da8df24d6b0817962f9

-- 
Thanks,
Zac



Re: [gentoo-portage-dev] [PATCH] LinkageMapELF: compute mulilib category for preserved libs (bug 598080)

2016-12-27 Thread Brian Dolbec
On Mon, 26 Dec 2016 20:37:39 -0800
Zac Medico  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 >= 0x300:
> + _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