62 lines
1.7 KiB
Python
62 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
|
|
|
def parse_linker_script(data):
|
|
pass
|
|
|
|
def link(groups):
|
|
defined_symbols = {}
|
|
undefined_symbols = set()
|
|
for group, files in groups:
|
|
while True:
|
|
found_something = False
|
|
|
|
for fn in files:
|
|
symbols = load_symbols(fn)
|
|
for symbol in symbols:
|
|
if symbol in defined_symbols:
|
|
|
|
if not group or not found_something:
|
|
break
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
import argparse
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('-T', '--script', type=str, help='Linker script to use')
|
|
parser.add_argument('-o', '--output', type=str, help='Output file to produce')
|
|
args, rest = parser.parse_known_intermixed_args()
|
|
print(rest)
|
|
|
|
addprefix = lambda *xs: [ prefix + opt for opt in xs for prefix in ('', '-Wl,') ]
|
|
START_GROUP = addprefix('-(', '--start-group')
|
|
END_GROUP = addprefix('-)', '--end-group')
|
|
GROUP_OPTS = [*START_GROUP, *END_GROUP]
|
|
input_files = [ arg for arg in rest if not arg.startswith('-') or arg in GROUP_OPTS ]
|
|
|
|
def input_file_iter(input_files):
|
|
group = False
|
|
files = []
|
|
for arg in input_files:
|
|
if arg in START_GROUP:
|
|
assert not group
|
|
|
|
if files:
|
|
yield False, files # nested -Wl,--start-group
|
|
group, files = True, []
|
|
|
|
elif arg in END_GROUP:
|
|
assert group # missing -Wl,--start-group
|
|
if files:
|
|
yield True, files
|
|
group, files = False, []
|
|
|
|
else:
|
|
files.append(arg)
|
|
|
|
assert not group # missing -Wl,--end-group
|
|
if files:
|
|
yield False, files
|
|
|
|
|
|
|