ar.pyplugin 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #!/usr/bin/env python3
  2. from __future__ import print_function
  3. import os
  4. import sys
  5. import subprocess
  6. def run(*args):
  7. return subprocess.check_output(list(args), shell=False).strip()
  8. def gen_renames_1(d):
  9. for l in d.split('\n'):
  10. l = l.strip()
  11. if ' ' in l:
  12. yield l.split(' ')[-1]
  13. def have_prefix(l, p):
  14. for x in l:
  15. if not x.startswith(p):
  16. return False
  17. return True
  18. def gen_renames_2(p, d):
  19. l = list(gen_renames_1(d))
  20. a = have_prefix(l, '_')
  21. for s in l:
  22. if 'asan_globals' in s:
  23. continue
  24. if s in ['HMAC', 'SHA1', 'SHA256', 'SHA256', 'SHA512', 'RC4', 'MD5', 'SHA384']:
  25. continue
  26. if a and s[1:] in ['HMAC', 'SHA1', 'SHA256', 'SHA256', 'SHA512', 'RC4', 'MD5', 'SHA384']:
  27. continue
  28. if a:
  29. yield s + ' _' + p + s[1:]
  30. else:
  31. yield s + ' ' + p + s
  32. def gen_renames(p, d):
  33. return '\n'.join(gen_renames_2(p, d)).strip() + '\n'
  34. def rename_syms(where, ret):
  35. p = 'v1_'
  36. # find symbols to rename
  37. syms = run(where + 'llvm-nm', '--extern-only', '--defined-only', '-A', ret)
  38. # prepare rename plan
  39. renames = gen_renames(p, syms)
  40. tmp = ret + '.syms'
  41. with open(tmp, 'w') as f:
  42. f.write(renames)
  43. # rename symbols
  44. run(where + 'llvm-objcopy', '--redefine-syms=' + tmp, ret)
  45. os.unlink(tmp)
  46. if __name__ == '__main__':
  47. rename_syms(os.path.dirname(sys.argv[3]) + '/', sys.argv[1])