Inside LinkageMap.rebuild(), ensure that all preserved libraries have an
authorZac Medico <zmedico@gentoo.org>
Fri, 13 Nov 2009 11:00:56 +0000 (11:00 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 13 Nov 2009 11:00:56 +0000 (11:00 -0000)
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/trunk/; revision=14820

pym/portage/dbapi/vartree.py

index b1d668654302352240fefdaf13818ece8b1acce0..27f2241c710e1c3d541997dfc3c64d0a85e1e155 100644 (file)
@@ -337,9 +337,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 = ["/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:
@@ -369,9 +371,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: