Files
2025-01-31 21:39:48 +01:00

81 lines
2.0 KiB
Python

import argparse
import os
from pathlib import Path
import platform
import re
import subprocess
parser = argparse.ArgumentParser(description='Mangles function declarations')
parser.add_argument('file', help='C/C++ source file with defined function to mangle')
tools_dir = Path(os.path.dirname(os.path.realpath(__file__)))
cc_path = tools_dir / 'mwccarm' / '2.0' / 'sp1p5' / 'mwccarm.exe'
root_dir = tools_dir.parent
include_dir = root_dir / 'include'
libs_dir = root_dir / 'libs'
libc_include_dir = libs_dir / 'c' / 'include'
libcpp_include_dir = libs_dir / 'cpp' / 'include'
libnds_include_dir = libs_dir / 'nds' / 'include'
if platform.system() == 'Windows': cc = [str(cc_path)]
else: cc = ['wine', str(cc_path)]
args = parser.parse_args()
cc.extend([
'-enum', 'int',
'-char', 'signed',
'-proc', 'arm946e',
'-gccext,on',
'-fp', 'soft',
'-inline', 'noauto',
'-Cpp_exceptions', 'off',
'-RTTI', 'off',
'-interworking',
'-nolink',
'-msgstyle', 'gcc',
'-dis',
'-gccinc',
'-i', include_dir,
'-i', libc_include_dir,
'-i', libcpp_include_dir,
'-i', libnds_include_dir,
args.file
])
try:
output = subprocess.check_output(cc)
except subprocess.CalledProcessError as e:
print(e.stdout.decode())
exit(1)
output = output.decode()
# print(output)
mangled_funcs: list[str] = re.findall(r'.text +([^\$ ]\S+)', output)
init_funcs: list[str] = re.findall(r'.init +([^\$ ]\S+)', output)
mangled_data: list[str] = re.findall(r'.data +([^\. ]\S+)', output)
mangled_bss: list[str] = re.findall(r'.bss +([^\. ]\S+)', output)
if len(mangled_funcs) > 0:
print('.text:\n')
for func in mangled_funcs:
print(func)
print('\n')
if len(init_funcs) > 0:
print('.init:\n')
for func in init_funcs:
print(func)
print('\n')
if len(mangled_data) > 0:
print('.data:\n')
for data in mangled_data:
print(data)
print('\n')
if len(mangled_bss) > 0:
print('.bss:\n')
for bss in mangled_bss:
print(bss)
print('\n')