Преглед на файлове

add a glibc compat check script

Thomas Waldmann преди 9 години
родител
ревизия
e023053472
променени са 1 файла, в които са добавени 61 реда и са изтрити 0 реда
  1. 61 0
      scripts/glibc_check.py

+ 61 - 0
scripts/glibc_check.py

@@ -0,0 +1,61 @@
+#!/usr/bin/env python3
+"""
+Check if all given binaries work with the given glibc version.
+
+check_glibc.py 2.11 bin [bin ...]
+"""
+
+import re
+import subprocess
+import sys
+
+verbose = True
+objdump = "objdump -T %s"
+glibc_re = re.compile(r'GLIBC_([0-9]\.[0-9]+)')
+
+
+def parse_version(v):
+    major, minor = v.split('.')
+    return int(major), int(minor)
+
+
+def format_version(version):
+    return "%d.%d" % version
+
+
+def main():
+    given = parse_version(sys.argv[1])
+    filenames = sys.argv[2:]
+
+    overall_versions = set()
+    for filename in filenames:
+        try:
+            output = subprocess.check_output(objdump % filename, shell=True,
+                                             stderr=subprocess.STDOUT)
+            output = output.decode('utf-8')
+            versions = set(parse_version(match.group(1))
+                           for match in glibc_re.finditer(output))
+            requires_glibc = max(versions)
+            overall_versions.add(requires_glibc)
+            if verbose:
+                print("%s %s" % (filename, format_version(requires_glibc)))
+        except subprocess.CalledProcessError as e:
+            if verbose:
+                print("%s errored." % filename)
+
+    wanted = max(overall_versions)
+    ok = given >= wanted
+
+    if verbose:
+        if ok:
+            print("The binaries work with the given glibc %s." %
+                  format_version(given))
+        else:
+            print("The binaries do not work with the given glibc %s. "
+                  "Minimum is: %s" % (format_version(given), format_version(wanted)))
+    return ok
+
+
+if __name__ == '__main__':
+    ok = main()
+    sys.exit(0 if ok else 1)