Eliminate the per-section 'keep' variable - the list of sections that will be emitted is sufficient to track that state.
Signed-off-by: Kevin O'Connor kevin@koconnor.net --- scripts/layoutrom.py | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-)
diff --git a/scripts/layoutrom.py b/scripts/layoutrom.py index a4eba89..1fae72d 100755 --- a/scripts/layoutrom.py +++ b/scripts/layoutrom.py @@ -467,8 +467,7 @@ def findReachable(anchorsections, checkreloc, data):
def checkRuntime(reloc, rsection, data, chain): section = reloc.symbol.section - if (section is None or not section.keep - or '.init.' in section.name or section.fileid != '32flat'): + if section is None or '.init.' in section.name or section.fileid != '32flat': return 0 if '.data.varinit.' in section.name: print("ERROR: %s is VARVERIFY32INIT but used from %s" % ( @@ -517,33 +516,18 @@ def checkKeepSym(reloc, syms, fileid, isxref): return 1
# Resolve a relocation and check if it should be kept in the final binary. -def checkKeep(reloc, section, infos, chain): - ret = checkKeepSym(reloc, infos[section.fileid][1], section.fileid, 0) +def checkKeep(reloc, section, symbols, chain): + ret = checkKeepSym(reloc, symbols[section.fileid], section.fileid, 0) if ret: return ret # Not in primary sections - it may be a cross 16/32 reference for fileid in ('16', '32seg', '32flat'): if fileid != section.fileid: - ret = checkKeepSym(reloc, infos[fileid][1], fileid, 1) + ret = checkKeepSym(reloc, symbols[fileid], fileid, 1) if ret: return ret return 0
-# Determine which sections are actually referenced and need to be -# placed into the output file. -def gc(info16, info32seg, info32flat): - anchorsections = [section for section in info16[0] - if (section.name.startswith('.fixedaddr.') - or '.export.' in section.name)] - infos = {'16': info16, '32seg': info32seg, '32flat': info32flat} - keepsections = findReachable(anchorsections, checkKeep, infos) - sections = [] - for section in info16[0] + info32seg[0] + info32flat[0]: - if section in keepsections: - section.keep = 1 - sections.append(section) - return sections -
###################################################################### # Startup and input parsing @@ -551,7 +535,7 @@ def gc(info16, info32seg, info32flat):
class Section: name = size = alignment = fileid = relocs = None - finalloc = finalsegloc = category = keep = None + finalloc = finalsegloc = category = None class Reloc: offset = type = symbolname = symbol = None class Symbol: @@ -674,7 +658,13 @@ def main(): config = scanconfig(cfgfile)
# Figure out which sections to keep. - sections = gc(info16, info32seg, info32flat) + allsections = info16[0] + info32seg[0] + info32flat[0] + symbols = {'16': info16[1], '32seg': info32seg[1], '32flat': info32flat[1]} + anchorsections = [section for section in info16[0] + if (section.name.startswith('.fixedaddr.') + or '.export.' in section.name)] + keepsections = findReachable(anchorsections, checkKeep, symbols) + sections = [section for section in allsections if section in keepsections]
# Separate 32bit flat into runtime and init parts findInit(sections) @@ -686,15 +676,15 @@ def main(): section.category = '32fseg'
# Determine the final memory locations of each kept section. - genreloc = '_reloc_abs_start' in info32flat[1] + genreloc = '_reloc_abs_start' in symbols['32flat'] li = doLayout(sections, config, genreloc)
# Exported symbols - li.exportsyms = [symbol for symbol in info16[1].values() + li.exportsyms = [symbol for symbol in symbols['16'].values() if (symbol.section is not None and '.export.' in symbol.section.name and symbol.name != symbol.section.name)] - li.varlowsyms = [symbol for symbol in info32flat[1].values() + li.varlowsyms = [symbol for symbol in symbols['32flat'].values() if (symbol.section is not None and symbol.section.finalloc is not None and '.data.varlow.' in symbol.section.name