public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/elfix:master commit in: misc/ldd/
@ 2014-05-27 17:35 Anthony G. Basile
  0 siblings, 0 replies; 8+ messages in thread
From: Anthony G. Basile @ 2014-05-27 17:35 UTC (permalink / raw
  To: gentoo-commits

commit:     d38e2718a641ce67d3caf598de5534e6ebef9e64
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Tue May 27 17:37:52 2014 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Tue May 27 17:37:52 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=d38e2718

misc/ldd: initial commit of python ldd script

---
 misc/ldd/ldd.py | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 95 insertions(+)

diff --git a/misc/ldd/ldd.py b/misc/ldd/ldd.py
new file mode 100755
index 0000000..afb03b6
--- /dev/null
+++ b/misc/ldd/ldd.py
@@ -0,0 +1,95 @@
+#!/usr/bin/env python
+
+import sys
+import re, glob
+from optparse import OptionParser
+
+from elftools import __version__
+from elftools.common.exceptions import ELFError
+from elftools.common.py3compat import bytes2str
+from elftools.elf.elffile import ELFFile
+from elftools.elf.dynamic import DynamicSection
+
+class ReadElf(object):
+    def __init__(self, file):
+        """ file: stream object with the ELF file to read
+        """
+        self.elffile = ELFFile(file)
+
+    def display_dynamic_dt_needed(self):
+        """ Display the dynamic DT_NEEDED contained in the file
+        """
+        for section in self.elffile.iter_sections():
+            if not isinstance(section, DynamicSection):
+                continue
+
+            for tag in section.iter_tags():
+                if tag.entry.d_tag == 'DT_NEEDED':
+                    sys.stdout.write('\t%s\n' % bytes2str(tag.needed) )
+
+
+def ldpath(ld_so_conf='/etc/ld.so.conf'):
+    """ Generate paths to search for libraries from ld.so.conf.  Recursively
+        parse included files.  We assume correct syntax and the ld.so.cache
+        is in sync with ld.so.conf.
+    """
+    with open(ld_so_conf, 'r') as path_file:
+        lines = path_file.read()
+    lines = re.sub('#.*', '', lines)                   # kill comments
+    lines = list(re.split(':+|\s+|\t+|\n+|,+', lines)) # man 8 ldconfig
+
+    include_globs = []
+    for l in lines:
+        if l == '':
+           lines.remove('')
+        if l == 'include':
+            f = lines[lines.index(l) + 1]
+            lines.remove(l)
+            lines.remove(f)
+            include_globs.append(f)
+
+    include_files = []
+    for g in include_globs:
+        include_files = include_files + glob.glob('/etc/' + g)
+    for c in include_files:
+        lines = lines + ldpath(c)
+
+    return list(set(lines))
+
+
+SCRIPT_DESCRIPTION = 'Print shared library dependencies'
+VERSION_STRING = '%%prog: based on pyelftools %s' % __version__
+
+def main():
+    optparser = OptionParser(
+        usage='usage: %prog <elf-file>',
+        description=SCRIPT_DESCRIPTION,
+        add_help_option=False, # -h is a real option of readelf
+        prog='ldd.py',
+        version=VERSION_STRING)
+    optparser.add_option('-h', '--help',
+        action='store_true', dest='help',
+        help='Display this information')
+    options, args = optparser.parse_args()
+
+    #if options.help or len(args) == 0:
+        #optparser.print_help()
+        #sys.exit(0)
+
+    for f in args:
+        with open(f, 'rb') as file:
+            try:
+                readelf = ReadElf(file)
+                if len(args) > 1:
+                    sys.stdout.write('%s : \n' % f)
+                readelf.display_dynamic_dt_needed()
+            except ELFError as ex:
+                sys.stderr.write('ELF error: %s\n' % ex)
+                sys.exit(1)
+
+    lines = ldpath()
+    print(lines)
+
+
+if __name__ == '__main__':
+    main()


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [gentoo-commits] proj/elfix:master commit in: misc/ldd/
@ 2014-05-27 23:24 Anthony G. Basile
  0 siblings, 0 replies; 8+ messages in thread
From: Anthony G. Basile @ 2014-05-27 23:24 UTC (permalink / raw
  To: gentoo-commits

commit:     54102922da2df25535d066899b00f85ff6ea938b
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Tue May 27 23:27:10 2014 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Tue May 27 23:27:10 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=54102922

misc/ldd: add code to search paths

---
 misc/ldd/ldd.py | 62 ++++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 44 insertions(+), 18 deletions(-)

diff --git a/misc/ldd/ldd.py b/misc/ldd/ldd.py
index afb03b6..4d6f500 100755
--- a/misc/ldd/ldd.py
+++ b/misc/ldd/ldd.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 
-import sys
+import os, sys
 import re, glob
 from optparse import OptionParser
 
@@ -9,6 +9,7 @@ from elftools.common.exceptions import ELFError
 from elftools.common.py3compat import bytes2str
 from elftools.elf.elffile import ELFFile
 from elftools.elf.dynamic import DynamicSection
+from elftools.elf.descriptions import describe_ei_class
 
 class ReadElf(object):
     def __init__(self, file):
@@ -16,19 +17,31 @@ class ReadElf(object):
         """
         self.elffile = ELFFile(file)
 
-    def display_dynamic_dt_needed(self):
-        """ Display the dynamic DT_NEEDED contained in the file
+
+    def elf_class(self):
+        """ Return the ELF Class
+        """
+        header = self.elffile.header
+        e_ident = header['e_ident']
+        return describe_ei_class(e_ident['EI_CLASS'])
+
+    def dynamic_dt_needed(self):
+        """ Return a list of the DT_NEEDED
         """
+        dt_needed = []
         for section in self.elffile.iter_sections():
             if not isinstance(section, DynamicSection):
                 continue
 
             for tag in section.iter_tags():
                 if tag.entry.d_tag == 'DT_NEEDED':
-                    sys.stdout.write('\t%s\n' % bytes2str(tag.needed) )
+                    dt_needed.append(bytes2str(tag.needed))
+                    #sys.stdout.write('\t%s\n' % bytes2str(tag.needed) )
+
+        return dt_needed
 
 
-def ldpath(ld_so_conf='/etc/ld.so.conf'):
+def ldpaths(ld_so_conf='/etc/ld.so.conf'):
     """ Generate paths to search for libraries from ld.so.conf.  Recursively
         parse included files.  We assume correct syntax and the ld.so.cache
         is in sync with ld.so.conf.
@@ -38,25 +51,33 @@ def ldpath(ld_so_conf='/etc/ld.so.conf'):
     lines = re.sub('#.*', '', lines)                   # kill comments
     lines = list(re.split(':+|\s+|\t+|\n+|,+', lines)) # man 8 ldconfig
 
+    paths = []
     include_globs = []
     for l in lines:
         if l == '':
-           lines.remove('')
+            continue
         if l == 'include':
             f = lines[lines.index(l) + 1]
-            lines.remove(l)
-            lines.remove(f)
             include_globs.append(f)
+            continue
+        if l not in include_globs:
+            paths.append(os.path.realpath(l))
 
     include_files = []
     for g in include_globs:
         include_files = include_files + glob.glob('/etc/' + g)
     for c in include_files:
-        lines = lines + ldpath(c)
+        paths = paths + ldpaths(os.path.realpath(c))
 
-    return list(set(lines))
+    return list(set(paths))
 
 
+def dynamic_dt_needed_paths( dt_needed, eclass, paths):
+    for n in dt_needed:
+        for p in paths:
+            print('%s' % p + '/' + n)
+    return
+
 SCRIPT_DESCRIPTION = 'Print shared library dependencies'
 VERSION_STRING = '%%prog: based on pyelftools %s' % __version__
 
@@ -72,9 +93,13 @@ def main():
         help='Display this information')
     options, args = optparser.parse_args()
 
-    #if options.help or len(args) == 0:
-        #optparser.print_help()
-        #sys.exit(0)
+    if options.help or len(args) == 0:
+        optparser.print_help()
+        sys.exit(0)
+
+    paths = ldpaths()
+    print(paths)
+    sys.exit(0)
 
     for f in args:
         with open(f, 'rb') as file:
@@ -82,14 +107,15 @@ def main():
                 readelf = ReadElf(file)
                 if len(args) > 1:
                     sys.stdout.write('%s : \n' % f)
-                readelf.display_dynamic_dt_needed()
+                eclass = readelf.elf_class()
+                #sys.stdout.write('\t%s\n' % eclass)
+                dt_needed = readelf.dynamic_dt_needed()
+                dt_needed_paths = dynamic_dt_needed_paths( dt_needed, eclass, paths)
+                for n in dt_needed:
+                    sys.stdout.write('\t%s\n' % n )
             except ELFError as ex:
                 sys.stderr.write('ELF error: %s\n' % ex)
                 sys.exit(1)
 
-    lines = ldpath()
-    print(lines)
-
-
 if __name__ == '__main__':
     main()


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [gentoo-commits] proj/elfix:master commit in: misc/ldd/
@ 2014-05-27 23:44 Anthony G. Basile
  0 siblings, 0 replies; 8+ messages in thread
From: Anthony G. Basile @ 2014-05-27 23:44 UTC (permalink / raw
  To: gentoo-commits

commit:     8209b9955e06f2238c7c4d2732652e7fb0f3c977
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Tue May 27 23:46:25 2014 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Tue May 27 23:46:25 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=8209b995

misc/ldd: correct logic for ldpaths()

---
 misc/ldd/ldd.py | 24 ++++++++++++++----------
 1 file changed, 14 insertions(+), 10 deletions(-)

diff --git a/misc/ldd/ldd.py b/misc/ldd/ldd.py
index 4d6f500..c1bcc19 100755
--- a/misc/ldd/ldd.py
+++ b/misc/ldd/ldd.py
@@ -53,15 +53,17 @@ def ldpaths(ld_so_conf='/etc/ld.so.conf'):
 
     paths = []
     include_globs = []
-    for l in lines:
-        if l == '':
+    for i in range(0,len(lines)):
+        if lines[i] == '':
             continue
-        if l == 'include':
-            f = lines[lines.index(l) + 1]
+        if lines[i] == 'include':
+            f = lines[i + 1]
             include_globs.append(f)
             continue
-        if l not in include_globs:
-            paths.append(os.path.realpath(l))
+        if lines[i] not in include_globs:
+            real_path = os.path.realpath(lines[i])
+            if os.path.exists(real_path):
+                paths.append(real_path)
 
     include_files = []
     for g in include_globs:
@@ -69,13 +71,17 @@ def ldpaths(ld_so_conf='/etc/ld.so.conf'):
     for c in include_files:
         paths = paths + ldpaths(os.path.realpath(c))
 
-    return list(set(paths))
+    paths = list(set(paths))
+    paths.sort()
+    return paths
 
 
 def dynamic_dt_needed_paths( dt_needed, eclass, paths):
     for n in dt_needed:
         for p in paths:
-            print('%s' % p + '/' + n)
+            lib = p + os.sep + n
+            if os.path.exists(lib):
+                print('%s' % lib)
     return
 
 SCRIPT_DESCRIPTION = 'Print shared library dependencies'
@@ -98,8 +104,6 @@ def main():
         sys.exit(0)
 
     paths = ldpaths()
-    print(paths)
-    sys.exit(0)
 
     for f in args:
         with open(f, 'rb') as file:


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [gentoo-commits] proj/elfix:master commit in: misc/ldd/
@ 2014-05-28  0:06 Anthony G. Basile
  0 siblings, 0 replies; 8+ messages in thread
From: Anthony G. Basile @ 2014-05-28  0:06 UTC (permalink / raw
  To: gentoo-commits

commit:     c86a02ad95c04a839ec79841d728b8ac83896dc7
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Wed May 28 00:07:43 2014 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Wed May 28 00:07:56 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=c86a02ad

misc/ldd: 'soname => paths' at depth = 1 only

---
 misc/ldd/ldd.py | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/misc/ldd/ldd.py b/misc/ldd/ldd.py
index c1bcc19..34d6642 100755
--- a/misc/ldd/ldd.py
+++ b/misc/ldd/ldd.py
@@ -77,12 +77,21 @@ def ldpaths(ld_so_conf='/etc/ld.so.conf'):
 
 
 def dynamic_dt_needed_paths( dt_needed, eclass, paths):
+    dt_needed_paths = {}
     for n in dt_needed:
         for p in paths:
             lib = p + os.sep + n
             if os.path.exists(lib):
-                print('%s' % lib)
-    return
+                with open(lib, 'rb') as file:
+                    try:
+                        readlib = ReadElf(file)
+                        if eclass == readlib.elf_class():
+                            dt_needed_paths[n] = lib
+                    except ELFError as ex:
+                        sys.stderr.write('ELF error: %s\n' % ex)
+                        sys.exit(1)
+
+    return dt_needed_paths
 
 SCRIPT_DESCRIPTION = 'Print shared library dependencies'
 VERSION_STRING = '%%prog: based on pyelftools %s' % __version__
@@ -112,11 +121,10 @@ def main():
                 if len(args) > 1:
                     sys.stdout.write('%s : \n' % f)
                 eclass = readelf.elf_class()
-                #sys.stdout.write('\t%s\n' % eclass)
                 dt_needed = readelf.dynamic_dt_needed()
                 dt_needed_paths = dynamic_dt_needed_paths( dt_needed, eclass, paths)
-                for n in dt_needed:
-                    sys.stdout.write('\t%s\n' % n )
+                for n, lib in dt_needed_paths.items():
+                    sys.stdout.write('\t%s => %s\n' % (n, lib))
             except ELFError as ex:
                 sys.stderr.write('ELF error: %s\n' % ex)
                 sys.exit(1)


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [gentoo-commits] proj/elfix:master commit in: misc/ldd/
@ 2014-05-28  0:16 Anthony G. Basile
  0 siblings, 0 replies; 8+ messages in thread
From: Anthony G. Basile @ 2014-05-28  0:16 UTC (permalink / raw
  To: gentoo-commits

commit:     88ba3abb4737cf252c7a15588b2f45e6ed37fb83
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Wed May 28 00:18:46 2014 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Wed May 28 00:18:46 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=88ba3abb

misc/ldd: add some comments

---
 misc/ldd/ldd.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/misc/ldd/ldd.py b/misc/ldd/ldd.py
index 34d6642..5a15786 100755
--- a/misc/ldd/ldd.py
+++ b/misc/ldd/ldd.py
@@ -77,6 +77,9 @@ def ldpaths(ld_so_conf='/etc/ld.so.conf'):
 
 
 def dynamic_dt_needed_paths( dt_needed, eclass, paths):
+    """ Search library paths for the library file corresponding
+        to the DT_NEEDED and ELF Class.
+    """
     dt_needed_paths = {}
     for n in dt_needed:
         for p in paths:
@@ -121,6 +124,7 @@ def main():
                 if len(args) > 1:
                     sys.stdout.write('%s : \n' % f)
                 eclass = readelf.elf_class()
+                # This needs to be iterated until we traverse the entire linkage tree
                 dt_needed = readelf.dynamic_dt_needed()
                 dt_needed_paths = dynamic_dt_needed_paths( dt_needed, eclass, paths)
                 for n, lib in dt_needed_paths.items():


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [gentoo-commits] proj/elfix:master commit in: misc/ldd/
@ 2014-05-28 16:30 Anthony G. Basile
  0 siblings, 0 replies; 8+ messages in thread
From: Anthony G. Basile @ 2014-05-28 16:30 UTC (permalink / raw
  To: gentoo-commits

commit:     b196a92359419799bd414be7f5643fd5b8545e37
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Wed May 28 16:32:49 2014 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Wed May 28 16:32:49 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=b196a923

misc/ldd: refactor all_dt_needed_paths for recursion

---
 misc/ldd/ldd.py | 33 +++++++++++++++++++--------------
 1 file changed, 19 insertions(+), 14 deletions(-)

diff --git a/misc/ldd/ldd.py b/misc/ldd/ldd.py
index 5a15786..1819607 100755
--- a/misc/ldd/ldd.py
+++ b/misc/ldd/ldd.py
@@ -96,6 +96,22 @@ def dynamic_dt_needed_paths( dt_needed, eclass, paths):
 
     return dt_needed_paths
 
+
+def all_dt_needed_paths(f, paths):
+    with open(f, 'rb') as file:
+        try:
+            readelf = ReadElf(file)
+            eclass = readelf.elf_class()
+            # This needs to be iterated until we traverse the entire linkage tree
+            dt_needed = readelf.dynamic_dt_needed()
+            dt_needed_paths = dynamic_dt_needed_paths( dt_needed, eclass, paths)
+            for n, lib in dt_needed_paths.items():
+                sys.stdout.write('\t%s => %s\n' % (n, lib))
+        except ELFError as ex:
+            sys.stderr.write('ELF error: %s\n' % ex)
+            sys.exit(1)
+
+
 SCRIPT_DESCRIPTION = 'Print shared library dependencies'
 VERSION_STRING = '%%prog: based on pyelftools %s' % __version__
 
@@ -118,20 +134,9 @@ def main():
     paths = ldpaths()
 
     for f in args:
-        with open(f, 'rb') as file:
-            try:
-                readelf = ReadElf(file)
-                if len(args) > 1:
-                    sys.stdout.write('%s : \n' % f)
-                eclass = readelf.elf_class()
-                # This needs to be iterated until we traverse the entire linkage tree
-                dt_needed = readelf.dynamic_dt_needed()
-                dt_needed_paths = dynamic_dt_needed_paths( dt_needed, eclass, paths)
-                for n, lib in dt_needed_paths.items():
-                    sys.stdout.write('\t%s => %s\n' % (n, lib))
-            except ELFError as ex:
-                sys.stderr.write('ELF error: %s\n' % ex)
-                sys.exit(1)
+        if len(args) > 1:
+            sys.stdout.write('%s : \n' % f)
+        all_dt_needed_paths(f, paths)
 
 if __name__ == '__main__':
     main()


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [gentoo-commits] proj/elfix:master commit in: misc/ldd/
@ 2014-06-01  2:05 Anthony G. Basile
  0 siblings, 0 replies; 8+ messages in thread
From: Anthony G. Basile @ 2014-06-01  2:05 UTC (permalink / raw
  To: gentoo-commits

commit:     0ebc3cb8dc5588d7be43b07cfd24fed93e8523a2
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Sun Jun  1 02:10:27 2014 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Sun Jun  1 02:10:27 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=0ebc3cb8

misc/ldd: recursively search all_dt_needed_paths

---
 misc/ldd/ldd.py | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/misc/ldd/ldd.py b/misc/ldd/ldd.py
index 1819607..3574137 100755
--- a/misc/ldd/ldd.py
+++ b/misc/ldd/ldd.py
@@ -78,7 +78,7 @@ def ldpaths(ld_so_conf='/etc/ld.so.conf'):
 
 def dynamic_dt_needed_paths( dt_needed, eclass, paths):
     """ Search library paths for the library file corresponding
-        to the DT_NEEDED and ELF Class.
+        to the given DT_NEEDED and ELF Class.
     """
     dt_needed_paths = {}
     for n in dt_needed:
@@ -97,20 +97,25 @@ def dynamic_dt_needed_paths( dt_needed, eclass, paths):
     return dt_needed_paths
 
 
-def all_dt_needed_paths(f, paths):
+def all_dynamic_dt_needed_paths(f, paths):
+    """ Return a dictionary of all the DT_NEEDED => Library Paths for
+        a given ELF file obtained by recursively following linkage.
+    """
     with open(f, 'rb') as file:
         try:
             readelf = ReadElf(file)
             eclass = readelf.elf_class()
             # This needs to be iterated until we traverse the entire linkage tree
             dt_needed = readelf.dynamic_dt_needed()
-            dt_needed_paths = dynamic_dt_needed_paths( dt_needed, eclass, paths)
+            dt_needed_paths = dynamic_dt_needed_paths(dt_needed, eclass, paths)
             for n, lib in dt_needed_paths.items():
-                sys.stdout.write('\t%s => %s\n' % (n, lib))
+                dt_needed_paths = dict(all_dynamic_dt_needed_paths(lib, paths), **dt_needed_paths)
         except ELFError as ex:
             sys.stderr.write('ELF error: %s\n' % ex)
             sys.exit(1)
 
+    return dt_needed_paths
+
 
 SCRIPT_DESCRIPTION = 'Print shared library dependencies'
 VERSION_STRING = '%%prog: based on pyelftools %s' % __version__
@@ -136,7 +141,9 @@ def main():
     for f in args:
         if len(args) > 1:
             sys.stdout.write('%s : \n' % f)
-        all_dt_needed_paths(f, paths)
+        all_dt_needed_paths = all_dynamic_dt_needed_paths(f, paths)
+        for n, lib in all_dt_needed_paths.items():
+            sys.stdout.write('\t%s => %s\n' % (n, lib))
 
 if __name__ == '__main__':
     main()


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [gentoo-commits] proj/elfix:master commit in: misc/ldd/
@ 2014-06-04  0:15 Anthony G. Basile
  0 siblings, 0 replies; 8+ messages in thread
From: Anthony G. Basile @ 2014-06-04  0:15 UTC (permalink / raw
  To: gentoo-commits

commit:     a32f1be0a8aa82db6d1b4992b8c13793538e8870
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Wed Jun  4 00:20:34 2014 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Wed Jun  4 00:20:34 2014 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=a32f1be0

misc/ldd: add caching to speed up recursion

---
 misc/ldd/ldd.py | 34 +++++++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 11 deletions(-)

diff --git a/misc/ldd/ldd.py b/misc/ldd/ldd.py
index 3574137..447614e 100755
--- a/misc/ldd/ldd.py
+++ b/misc/ldd/ldd.py
@@ -76,23 +76,35 @@ def ldpaths(ld_so_conf='/etc/ld.so.conf'):
     return paths
 
 
+# We cache the dependencies for speed.  The structure is
+# { ELFClass : { SONAME : library, ... }, ELFClass : ... }
+cache = {}
+
 def dynamic_dt_needed_paths( dt_needed, eclass, paths):
     """ Search library paths for the library file corresponding
         to the given DT_NEEDED and ELF Class.
     """
+    global cache
+    if not eclass in cache:
+        cache[eclass] = {}
+
     dt_needed_paths = {}
     for n in dt_needed:
-        for p in paths:
-            lib = p + os.sep + n
-            if os.path.exists(lib):
-                with open(lib, 'rb') as file:
-                    try:
-                        readlib = ReadElf(file)
-                        if eclass == readlib.elf_class():
-                            dt_needed_paths[n] = lib
-                    except ELFError as ex:
-                        sys.stderr.write('ELF error: %s\n' % ex)
-                        sys.exit(1)
+        if n in cache[eclass].keys():
+           dt_needed_paths[n] = cache[eclass][n]
+        else:
+            for p in paths:
+                lib = p + os.sep + n
+                if os.path.exists(lib):
+                    with open(lib, 'rb') as file:
+                        try:
+                            readlib = ReadElf(file)
+                            if eclass == readlib.elf_class():
+                                dt_needed_paths[n] = lib
+                                cache[eclass][n] = lib
+                        except ELFError as ex:
+                            sys.stderr.write('ELF error: %s\n' % ex)
+                            sys.exit(1)
 
     return dt_needed_paths
 


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2014-06-04  0:16 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-27 23:44 [gentoo-commits] proj/elfix:master commit in: misc/ldd/ Anthony G. Basile
  -- strict thread matches above, loose matches on Subject: below --
2014-06-04  0:15 Anthony G. Basile
2014-06-01  2:05 Anthony G. Basile
2014-05-28 16:30 Anthony G. Basile
2014-05-28  0:16 Anthony G. Basile
2014-05-28  0:06 Anthony G. Basile
2014-05-27 23:24 Anthony G. Basile
2014-05-27 17:35 Anthony G. Basile

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox