[SeaBIOS] [PATCH 07/10] build: Keep segmented sections separate until final link step.
Kevin O'Connor
kevin at koconnor.net
Wed Jun 11 21:22:55 CEST 2014
Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
Makefile | 2 +-
scripts/layoutrom.py | 52 ++++++++++++++++++++--------------------------------
2 files changed, 21 insertions(+), 33 deletions(-)
diff --git a/Makefile b/Makefile
index d788ffe..e095601 100644
--- a/Makefile
+++ b/Makefile
@@ -57,7 +57,7 @@ COMMONCFLAGS := -I$(OUT) -Isrc -Os -MD -g \
-m32 -march=i386 -mregparm=3 -mpreferred-stack-boundary=2 \
-minline-all-stringops \
-freg-struct-return -ffreestanding -fno-delete-null-pointer-checks \
- -ffunction-sections -fdata-sections -fno-common
+ -ffunction-sections -fdata-sections -fno-common -fno-merge-constants
COMMONCFLAGS += $(call cc-option,$(CC),-nopie,)
COMMONCFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
COMMONCFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,)
diff --git a/scripts/layoutrom.py b/scripts/layoutrom.py
index 3eca823..20ffbe0 100755
--- a/scripts/layoutrom.py
+++ b/scripts/layoutrom.py
@@ -175,10 +175,7 @@ def doLayout(sections, config, genreloc):
# Determine 16bit positions
li.sections16 = getSectionsCategory(sections, '16')
textsections = getSectionsPrefix(li.sections16, '.text.')
- rodatasections = (
- getSectionsPrefix(li.sections16, '.rodata.str1.1')
- + getSectionsPrefix(li.sections16, '.rodata.__func__.')
- + getSectionsPrefix(li.sections16, '.rodata.__PRETTY_FUNCTION__.'))
+ rodatasections = getSectionsPrefix(li.sections16, '.rodata')
datasections = getSectionsPrefix(li.sections16, '.data16.')
fixedsections = getSectionsPrefix(li.sections16, '.fixedaddr.')
@@ -191,10 +188,7 @@ def doLayout(sections, config, genreloc):
# Determine 32seg positions
li.sections32seg = getSectionsCategory(sections, '32seg')
textsections = getSectionsPrefix(li.sections32seg, '.text.')
- rodatasections = (
- getSectionsPrefix(li.sections32seg, '.rodata.str1.1')
- + getSectionsPrefix(li.sections32seg, '.rodata.__func__.')
- + getSectionsPrefix(li.sections32seg, '.rodata.__PRETTY_FUNCTION__.'))
+ rodatasections = getSectionsPrefix(li.sections32seg, '.rodata')
datasections = getSectionsPrefix(li.sections32seg, '.data32seg.')
li.sec32seg_start, li.sec32seg_align = setSectionsStart(
@@ -305,6 +299,16 @@ def outXRefs(sections, useseg=0, exportsyms=[], forcedelta=0):
out += "%s = 0x%x ;\n" % (symbolname, loc + forcedelta + symbol.offset)
return out
+# Write LD script includes for the given sections
+def outSections(sections, useseg=0):
+ out = ""
+ for section in sections:
+ loc = section.finalloc
+ if useseg:
+ loc = section.finalsegloc
+ out += "%s 0x%x : { *(%s) }\n" % (section.name, loc, section.name)
+ return out
+
# Write LD script includes for the given sections using relative offsets
def outRelSections(sections, startsym, useseg=0):
sections = [(section.finalloc, section) for section in sections
@@ -316,9 +320,9 @@ def outRelSections(sections, startsym, useseg=0):
if useseg:
loc = section.finalsegloc
out += ". = ( 0x%x - %s ) ;\n" % (loc, startsym)
- if section.name == '.rodata.str1.1':
- out += "_rodata = . ;\n"
- out += "*(%s)\n" % (section.name,)
+ if section.name in ('.rodata.str1.1', '.rodata'):
+ out += "_rodata%s = . ;\n" % (section.fileid,)
+ out += "*%s.*(%s)\n" % (section.fileid, section.name)
return out
# Build linker script output for a list of relocations.
@@ -344,26 +348,17 @@ def writeLinkerScripts(li, out16, out32seg, out32flat):
zonelow_base = 0x%x ;
_zonelow_seg = 0x%x ;
- code16_start = 0x%x ;
- .text16 code16_start : {
%s
- }
""" % (li.zonelow_base,
int(li.zonelow_base / 16),
- li.sec16_start - BUILD_BIOS_ADDR,
- outRelSections(li.sections16, 'code16_start', useseg=1))
+ outSections(li.sections16, useseg=1))
outfile = open(out16, 'w')
outfile.write(COMMONHEADER + out + COMMONTRAILER)
outfile.close()
# Write 32seg linker script
- out = outXRefs(li.sections32seg, useseg=1) + """
- code32seg_start = 0x%x ;
- .text32seg code32seg_start : {
-%s
- }
-""" % (li.sec32seg_start - BUILD_BIOS_ADDR,
- outRelSections(li.sections32seg, 'code32seg_start', useseg=1))
+ out = (outXRefs(li.sections32seg, useseg=1)
+ + outSections(li.sections32seg, useseg=1))
outfile = open(out32seg, 'w')
outfile.write(COMMONHEADER + out + COMMONTRAILER)
outfile.close()
@@ -406,11 +401,6 @@ def writeLinkerScripts(li, out16, out32seg, out32flat):
%s
code32init_end = ABSOLUTE(.) ;
%s
-%s
- . = ( 0x%x - code32flat_start ) ;
- *(.text32seg)
- . = ( 0x%x - code32flat_start ) ;
- *(.text16)
code32flat_end = ABSOLUTE(.) ;
} :text
""" % (li.sec32init_align,
@@ -423,10 +413,8 @@ def writeLinkerScripts(li, out16, out32seg, out32flat):
relocstr,
outRelSections(li.sections32low, 'code32flat_start'),
outRelSections(li.sections32init, 'code32flat_start'),
- outRelSections(li.sections32flat, 'code32flat_start'),
- outRelSections(li.sections32fseg, 'code32flat_start'),
- li.sec32seg_start,
- li.sec16_start)
+ outRelSections(li.sections32flat + li.sections32fseg
+ + li.sections32seg + li.sections16, 'code32flat_start'))
out = COMMONHEADER + out + COMMONTRAILER + """
ENTRY(%s)
PHDRS
--
1.9.3
More information about the SeaBIOS
mailing list