68 lines
1.8 KiB
Python
Executable file
68 lines
1.8 KiB
Python
Executable file
#!python3
|
|
|
|
import re
|
|
import sys
|
|
from subprocess import Popen, PIPE
|
|
|
|
def header(filename):
|
|
return f"""
|
|
# ------------------
|
|
.file "{filename}"
|
|
# ------------------
|
|
"""
|
|
|
|
REPLACEMENTS = [
|
|
(r'^\.section "\.text([^"]*)"(,"([^"]*))?"$', r'.text ; \1, \3'),
|
|
(r'^\.section "\.data([^"]*)"$', r'.data ; \1'),
|
|
(r'^\.section "\.bss([^"]*)"$', r'.bss ; \1'),
|
|
(r'^\.section "\.init_array"(,"([^"]*)")?', r'.section __DATA, .init_array ; \2'),
|
|
(r'^\.section "\.fini_array"(,"([^"]*)")?', r'.section __DATA, .fini_array ; \2'),
|
|
(r'^\.section "\.test_array"(,"([^"]*)")?', r'.section __DATA, .test_array ; \2'),
|
|
(r'^\.section \.abort "([^"]+)"', r'.section __DATA, .abort $COMMENT \1'),
|
|
(r'^(\.type .+)', '; \1'),
|
|
(r'^(\.global) (rt\..+)', r'\1 _\2'),
|
|
(r'^(rt\..+:)', r'_\1'),
|
|
(r'^(crypto\.aes\.x86ni_.+:)', r'_\1'),
|
|
(r'^(debug\.getfp:)', r'_\1'),
|
|
(r'adrp x0, _environ@page', r'adrp x0, _environ@GOTPAGE'),
|
|
(r'add x0, x0, _environ@pageoff', r'ldr x0, [x0, _environ@GOTPAGEOFF]'),
|
|
]
|
|
|
|
def fix_asm(code):
|
|
for (pattern, repl) in REPLACEMENTS:
|
|
code = re.sub(pattern, repl, code, flags=re.MULTILINE)
|
|
return code
|
|
|
|
args = ['as']
|
|
files = []
|
|
argv = sys.argv[1:]
|
|
while len(argv):
|
|
if argv[0] == "--":
|
|
args.append("--")
|
|
elif argv[0] in ["-o", "-I", "-arch"]:
|
|
args.append(argv[0])
|
|
args.append(argv[1])
|
|
argv.pop(0)
|
|
elif argv[0][0] == "-":
|
|
argv.append(argv[0])
|
|
else:
|
|
files.append(argv[0])
|
|
|
|
argv.pop(0)
|
|
|
|
args.append("-")
|
|
|
|
code = ""
|
|
for file in files:
|
|
with open(file) as fp:
|
|
content = fp.read()
|
|
code += header(file)
|
|
code += "\n"
|
|
code += fix_asm(content)
|
|
code += "\n"
|
|
|
|
p = Popen(args, stdout=PIPE, stdin=PIPE, stderr=PIPE, text=True)
|
|
data = p.communicate(input=code)
|
|
print(data[1], end='', file=sys.stderr)
|
|
print(data[0], end='')
|