Files
Arnaud Diederen bf7a817c1d Backported fixes
2020-01-06 09:48:53 +01:00

66 lines
2.0 KiB
Python
Executable File

import subprocess
import re
# idea borrowed from implib-gen.py
def collect_syms(f, symlist = None):
p = subprocess.Popen(["readelf", "-sDW", f], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(out, err) = p.communicate()
out = out.decode('utf-8')
err = err.decode('utf-8')
if p.returncode != 0 or err:
error("readelf failed with retcode %d: %s" % (p.returncode, err))
toc = None
syms = []
warn_versioned = False
for line in out.splitlines():
line = line.strip()
if not line:
continue
# Num Buc: Value Size Type Bind Vis Ndx Name
# 492 0: 00000000005ebac0 400 OBJECT GLOBAL DEFAULT 24 PyTraceBack_Type
# 493 0: 00000000001cfc30 13 FUNC GLOBAL DEFAULT 12 Py_CompileString
words = re.split(r' +', line)
if line.startswith('Num'): # Header?
if toc is not None:
error("multiple headers in output of readelf")
toc = {}
for i, n in enumerate(words):
# Colons are different across readelf versions so get rid of them.
n = n.replace(':', '')
toc[i] = n
elif toc is not None:
sym = {k: words[i] for i, k in toc.items()}
if '@' in sym['Name']:
name, ver = sym['Name'].split('@')
sym['Name'] = name
sym['Version'] = ver
if not warn_versioned:
# TODO
warn("library %s contains versioned symbols which are NYI" % f)
warn_versioned = True
else:
sym['Version'] = None
if symlist and sym['Name'] not in symlist:
continue
syms.append(sym)
if toc is None:
error("failed to analyze %s" % f)
return syms
import sys
syms = collect_syms(sys.argv[1])
for sym in syms:
nm = sym['Name']
sz = sym['Size']
tp =sym['Type']
if sz != '0':
if tp=="FUNC":
print (" void %s(){};" % nm)
elif tp =="OBJECT":
print ('__asm__(".globl %s; .pushsection .data; .type %s,@object; .size %s, %s; %s: .zero %s; .popsection");' %(nm, nm, nm, sz, nm, sz))