113 lines
3.3 KiB
Python
113 lines
3.3 KiB
Python
|
from elftools.elf.elffile import ELFFile
|
|||
|
import re,os
|
|||
|
|
|||
|
hdr_str=["#include \"opensdk.h\"\n"]
|
|||
|
symbol_table_org=[]
|
|||
|
symbol_table = []
|
|||
|
gen_table=[]
|
|||
|
|
|||
|
def get_export_func(f):
|
|||
|
file = open(f, 'r')
|
|||
|
try:
|
|||
|
while True:
|
|||
|
line = file.readline()
|
|||
|
if line:
|
|||
|
# print ("line=",line)
|
|||
|
tmp = re.findall(r"EXPORT_FUNC\((.+)\)",line)
|
|||
|
if tmp:
|
|||
|
print(tmp[0])
|
|||
|
symbol_table_org.append(line)
|
|||
|
symbol_table.append(tmp[0])
|
|||
|
print("#define app_"+tmp[0]+"_addr ")
|
|||
|
else:
|
|||
|
break
|
|||
|
finally:
|
|||
|
file.close()
|
|||
|
print(symbol_table)
|
|||
|
print("get_export_func")
|
|||
|
|
|||
|
def get_info_from_elf(e_file): # e_file为需要读取的elf文件
|
|||
|
tmp_dict = {} # 这个字典用于存放变量名和变量地址的对应关系
|
|||
|
file = open(e_file, 'rb')
|
|||
|
elf_file_obj = ELFFile(file)
|
|||
|
|
|||
|
data_section = elf_file_obj.get_section_by_name('.data')
|
|||
|
data_address = data_section.header["sh_addr"]
|
|||
|
print(data_section.data())
|
|||
|
print("data addr:0x%X"%data_address)
|
|||
|
dfile = open("test.data.bin", 'wb')
|
|||
|
dfile.write(data_section.data());
|
|||
|
dfile.close()
|
|||
|
|
|||
|
text_section = elf_file_obj.get_section_by_name(".text")
|
|||
|
base_address = text_section.header["sh_addr"]
|
|||
|
print(text_section.data())
|
|||
|
print("text addr:0x%X"%base_address)
|
|||
|
tfile = open("test.text.bin", 'wb')
|
|||
|
tfile.write(text_section.data());
|
|||
|
tfile.close()
|
|||
|
|
|||
|
# got_section = elf_file_obj.get_section_by_name('.got')
|
|||
|
# got_address = got_section.header["sh_addr"]
|
|||
|
# print(got_section.data())
|
|||
|
# print("got addr:0x%X"%got_address)
|
|||
|
# gfile = open("test.got.bin", 'wb')
|
|||
|
# gfile.write(got_section.data());
|
|||
|
# gfile.close()
|
|||
|
|
|||
|
# plt_section = elf_file_obj.get_section_by_name('.got.plt')
|
|||
|
# plt_address = plt_section.header["sh_addr"]
|
|||
|
# print(plt_section.data())
|
|||
|
# print("plt addr:0x%X"%plt_address)
|
|||
|
# pfile = open("test.plt.bin", 'wb')
|
|||
|
# pfile.write(plt_section.data());
|
|||
|
# pfile.close()
|
|||
|
|
|||
|
for section in elf_file_obj.iter_sections():
|
|||
|
# 此处把地址以16进制的字符串形式存入字典,可选择自己需要的格式。
|
|||
|
print(section)
|
|||
|
# tmp_dict[s.name] = str(hex(s.entry["st_value"]))section
|
|||
|
file.close()
|
|||
|
return tmp_dict
|
|||
|
|
|||
|
def gen_hdr(e_file):
|
|||
|
print("gen header file")
|
|||
|
tmp_dict = {}
|
|||
|
file = open(e_file, 'rb')
|
|||
|
elf_file_obj = ELFFile(file)
|
|||
|
|
|||
|
symbol_table_name = elf_file_obj.get_section_by_name(".symtab")
|
|||
|
for sym in symbol_table_name.iter_symbols():
|
|||
|
print(sym.name)
|
|||
|
print(sym['st_value'])
|
|||
|
if sym.name in symbol_table:
|
|||
|
gen_table.append("#define app_"+sym.name+"_addr "+str(hex(sym['st_value']))+"\n")
|
|||
|
print("insert one sym")
|
|||
|
print(gen_table)
|
|||
|
|
|||
|
f = open("export_new.h", 'w')
|
|||
|
for line in hdr_str:
|
|||
|
f.writelines(line)
|
|||
|
|
|||
|
f.writelines("\n")
|
|||
|
for line in symbol_table_org:
|
|||
|
f.writelines(line)
|
|||
|
|
|||
|
f.writelines("\n")
|
|||
|
|
|||
|
for line in gen_table:
|
|||
|
f.writelines(line)
|
|||
|
|
|||
|
f.close()
|
|||
|
|
|||
|
try:
|
|||
|
os.remove("inc/export.h")
|
|||
|
except:
|
|||
|
print("no inc/export.h")
|
|||
|
os.rename("export_new.h","inc/export.h")
|
|||
|
|
|||
|
get_info_from_elf("test.elf")
|
|||
|
get_export_func("inc/export.h")
|
|||
|
gen_hdr("test.elf")
|
|||
|
|