build: Use fileid instead of category to write sections in layoutrom.py.
The 'category' really determines the memory location while the
'fileid' determines which link stage the section is in. So, use
'fileid' when writing the linker scripts.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
diff --git a/scripts/layoutrom.py b/scripts/layoutrom.py
index 20ffbe0..0b88768 100755
--- a/scripts/layoutrom.py
+++ b/scripts/layoutrom.py
@@ -149,6 +149,10 @@
def getSectionsCategory(sections, category):
return [section for section in sections if section.category == category]
+# Return the subset of sections with a given fileid
+def getSectionsFileid(sections, fileid):
+ return [section for section in sections if section.fileid == fileid]
+
# Return the subset of sections with a given name prefix
def getSectionsPrefix(sections, prefix):
return [section for section in sections
@@ -156,6 +160,7 @@
# The sections (and associated information) to be placed in output rom
class LayoutInfo:
+ sections = None
genreloc = None
sections16 = sec16_start = sec16_align = None
sections32seg = sec32seg_start = sec32seg_align = None
@@ -171,6 +176,7 @@
# Determine final memory addresses for sections
def doLayout(sections, config, genreloc):
li = LayoutInfo()
+ li.sections = sections
li.genreloc = genreloc
# Determine 16bit positions
li.sections16 = getSectionsCategory(sections, '16')
@@ -344,35 +350,36 @@
# Output the linker scripts for all required sections.
def writeLinkerScripts(li, out16, out32seg, out32flat):
# Write 16bit linker script
- out = outXRefs(li.sections16, useseg=1) + """
+ filesections16 = getSectionsFileid(li.sections, '16')
+ out = outXRefs(filesections16, useseg=1) + """
zonelow_base = 0x%x ;
_zonelow_seg = 0x%x ;
%s
""" % (li.zonelow_base,
int(li.zonelow_base / 16),
- outSections(li.sections16, useseg=1))
+ outSections(filesections16, useseg=1))
outfile = open(out16, 'w')
outfile.write(COMMONHEADER + out + COMMONTRAILER)
outfile.close()
# Write 32seg linker script
- out = (outXRefs(li.sections32seg, useseg=1)
- + outSections(li.sections32seg, useseg=1))
+ filesections32seg = getSectionsFileid(li.sections, '32seg')
+ out = (outXRefs(filesections32seg, useseg=1)
+ + outSections(filesections32seg, useseg=1))
outfile = open(out32seg, 'w')
outfile.write(COMMONHEADER + out + COMMONTRAILER)
outfile.close()
# Write 32flat linker script
- sections32all = (li.sections32flat + li.sections32init + li.sections32fseg)
sec32all_start = li.sec32low_start
relocstr = ""
if li.genreloc:
# Generate relocations
- initsections = dict([(s, 1) for s in li.sections32init])
- noninitsections = dict([(s, 1) for s in (
- li.sections32flat + li.sections32low + li.sections16
- + li.sections32seg + li.sections32fseg)])
+ initsections = dict([
+ (s, 1) for s in getSectionsCategory(li.sections, '32init')])
+ noninitsections = dict([(s, 1) for s in li.sections
+ if s not in initsections])
absrelocs = getRelocs(initsections, initsections, type='R_386_32')
relrelocs = getRelocs(initsections, noninitsections, type='R_386_PC32')
initrelocs = getRelocs(noninitsections, initsections)
@@ -381,25 +388,24 @@
+ strRelocs("_reloc_init", "code32flat_start", initrelocs))
numrelocs = len(absrelocs + relrelocs + initrelocs)
sec32all_start -= numrelocs * 4
- out = outXRefs(li.sections32low, exportsyms=li.varlowsyms
+ filesections32flat = getSectionsFileid(li.sections, '32flat')
+ out = outXRefs([], exportsyms=li.varlowsyms
, forcedelta=li.final_sec32low_start-li.sec32low_start)
- out += outXRefs(sections32all, exportsyms=[li.entrysym]) + """
+ out += outXRefs(filesections32flat, exportsyms=[li.entrysym]) + """
_reloc_min_align = 0x%x ;
zonefseg_start = 0x%x ;
zonefseg_end = 0x%x ;
zonelow_base = 0x%x ;
final_varlow_start = 0x%x ;
final_readonly_start = 0x%x ;
+ varlow_start = 0x%x ;
+ varlow_end = 0x%x ;
+ code32init_start = 0x%x ;
+ code32init_end = 0x%x ;
code32flat_start = 0x%x ;
.text code32flat_start : {
%s
- varlow_start = ABSOLUTE(.) ;
-%s
- varlow_end = ABSOLUTE(.) ;
- code32init_start = ABSOLUTE(.) ;
-%s
- code32init_end = ABSOLUTE(.) ;
%s
code32flat_end = ABSOLUTE(.) ;
} :text
@@ -409,12 +415,13 @@
li.zonelow_base,
li.final_sec32low_start,
li.final_readonly_start,
+ li.sec32low_start,
+ li.sec32init_start,
+ li.sec32init_start,
+ li.sec32flat_start,
sec32all_start,
relocstr,
- outRelSections(li.sections32low, 'code32flat_start'),
- outRelSections(li.sections32init, 'code32flat_start'),
- outRelSections(li.sections32flat + li.sections32fseg
- + li.sections32seg + li.sections16, 'code32flat_start'))
+ outRelSections(li.sections, 'code32flat_start'))
out = COMMONHEADER + out + COMMONTRAILER + """
ENTRY(%s)
PHDRS