From: Justin Cinkelj <justin.cink...@xlab.si>
Committer: Nadav Har'El <n...@scylladb.com>
Branch: master
gdb: search for binary with help of usr.manifest
When gdb searches for binary in host filesystem, only binary basename
is searched for. If multiple applications use the same name (say we have
OSV_DIR/app1/hello.so and OSV_DIR/app2/hello.so), then simply the first
found file is used. That might not be correct.
In cases when usr.manifest is available, it can be used to find binary
more reliably. This is implemented by that commit. If usr.manifest isn't
found or doesn't contain info about our binary, the old method of
traversing selected directories is used.
Fixes #848
Signed-off-by: Justin Cinkelj <justin.cink...@xlab.si>
Message-Id: <20170202214420.2729-1-justin.cink...@xlab.si>
---
diff --git a/scripts/loader.py b/scripts/loader.py
--- a/scripts/loader.py
+++ b/scripts/loader.py
@@ -116,8 +116,50 @@ def symbol_formatter(src_addr):
def syminfo(addr):
return symbol_formatter(symbol_resolver(addr)[0])
+class Manifest(object):
+
+ def __init__(self):
+ # Load data from usr.manifest in build_dir
+ mm_path = os.path.join(build_dir, 'usr.manifest')
+ try:
+ self.data = open(mm_path).read().split('\n')
+ except IOError:
+ self.data = []
+
+ def find(self, path):
+ '''Try to locate file with help of usr.manifest'''
+ files = [ff.split(':', 1)[1].strip() for ff in self.data if
ff.split(':', 1)[0].strip() == path]
+ if files:
+ file = files[-1] # the last line in usr.manifest wins
+ else:
+ file = ""
+ file = self.resolve_symlink(file)
+ print('manifest.find_file: path=%s, found file=%s' % (path, file))
+ # usr.manifest contains lines
like "%(gccbase)s/lib64/libgcc_s.so.1" too.
+ # Filter out such cases.
+ if os.path.exists(file):
+ return file
+ else:
+ return ""
+
+ def resolve_symlink(self, file):
+ '''If file is a symlink, try to resolve it with help of
usr.manifest'''
+ resolved_file = file
+ if file.startswith('->'):
+ path = file[2:]
+ resolved_file = self.find(path)
+ # print('manifest.resolve_symlink: file=%s,
resolved_file=%s' % (file, resolved_file))
+ return resolved_file
+
+manifest = Manifest()
+
def translate(path):
'''given a path, try to find it on the host OS'''
+ # First, try to locate file with help of usr.manifest
+ file = manifest.find(path)
+ if file:
+ return file
+ # Next, search for file in configured directories
name = os.path.basename(path)
for top in [build_dir, external, modules, apps_dir, '/zfs']:
for root, dirs, files in os.walk(top):
--
You received this message because you are subscribed to the Google Groups "OSv
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to osv-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.