Merged from trunk -r14819:14820
authorFabian Groffen <grobian@gentoo.org>
Thu, 19 Nov 2009 19:48:32 +0000 (19:48 -0000)
committerFabian Groffen <grobian@gentoo.org>
Thu, 19 Nov 2009 19:48:32 +0000 (19:48 -0000)
   | 14820   | Inside LinkageMap.rebuild(), ensure that all preserved       |
   | zmedico | libraries have an entry in self._obj_properties, even when   |
   |         | they fail to appear in scanelf output. This is important in  |
   |         | order to prevent findConsumers from raising an unwanted      |
   |         | KeyError.                                                    |

svn path=/main/branches/prefix/; revision=14848

pym/portage/dbapi/vartree.py

index a2a40c540f1d7703235c11d85270d6ac7eeb29ef..c305f9c8092eeecbffecdd116695e5ce4c4abb92 100644 (file)
@@ -338,9 +338,11 @@ class LinkageMap(object):
 
                # have to call scanelf for preserved libs here as they aren't 
                # registered in NEEDED.ELF.2 files
+               plibs = set()
                if self._dbapi.plib_registry and self._dbapi.plib_registry.getPreservedLibs():
                        args = [EPREFIX+"/usr/bin/scanelf", "-qF", "%a;%F;%S;%r;%n"]
                        for items in self._dbapi.plib_registry.getPreservedLibs().values():
+                               plibs.update(items)
                                args.extend(os.path.join(root, x.lstrip("." + os.sep)) \
                                        for x in items)
                        try:
@@ -370,9 +372,20 @@ class LinkageMap(object):
                                                        level=logging.ERROR, noiselevel=-1)
                                                continue
                                        fields[1] = fields[1][root_len:]
+                                       plibs.discard(fields[1])
                                        lines.append(";".join(fields))
                                proc.wait()
 
+               if plibs:
+                       # Preserved libraries that did not appear in the scanelf output.
+                       # This is known to happen with statically linked libraries.
+                       # Generate dummy lines for these, so we can assume that every
+                       # preserved library has an entry in self._obj_properties. This
+                       # is important in order to prevent findConsumers from raising
+                       # an unwanted KeyError.
+                       for x in plibs:
+                               lines.append(";".join(['', x, '', '', '']))
+
                for l in lines:
                        l = l.rstrip("\n")
                        if not l: