mirror of
https://github.com/idapython/src
synced 2026-06-08 14:47:00 +00:00
66 lines
2.0 KiB
Python
Executable File
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))
|