diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2016-02-19 21:34:16 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2016-02-19 21:34:16 -0500 |
commit | 3910de0dee216d5b5bf23cfa29bfc80d082b2ee7 (patch) | |
tree | db466e176e51041b366822ecd184726489f54b1f /scripts/layoutrom.py | |
parent | 265f4c511c09548fdbc2ec702ce53a88af34836e (diff) | |
download | seabios-3910de0dee216d5b5bf23cfa29bfc80d082b2ee7.tar.gz |
build: fix .text section address alignment
Some linkers verify that sections have a start address that is aligned
with the minimum alignment of that section. Add extra padding to the
".text" section to ensure it is always aligned with the maximum
alignment of any section placed in ".text".
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reported by: Ed Maste <emaste@FreeBSD.org>
Diffstat (limited to 'scripts/layoutrom.py')
-rwxr-xr-x | scripts/layoutrom.py | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/scripts/layoutrom.py b/scripts/layoutrom.py index b976fb05..6616721d 100755 --- a/scripts/layoutrom.py +++ b/scripts/layoutrom.py @@ -34,18 +34,22 @@ COMMONTRAILER = """ # Determine section locations ###################################################################### -# Align 'pos' to 'alignbytes' offset +# Align 'pos' up to 'alignbytes' offset def alignpos(pos, alignbytes): mask = alignbytes - 1 return (pos + mask) & ~mask +# Align 'pos' down to 'alignbytes' offset +def aligndown(pos, alignbytes): + mask = alignbytes - 1 + return pos & ~mask + # Determine the final addresses for a list of sections that end at an # address. def setSectionsStart(sections, endaddr, minalign=1, segoffset=0): totspace = 0 for section in sections: - if section.align > minalign: - minalign = section.align + minalign = max(minalign, section.align) totspace = alignpos(totspace, section.align) + section.size startaddr = int((endaddr - totspace) / minalign) * minalign curaddr = startaddr @@ -269,7 +273,7 @@ def doLayout(sections, config, genreloc): final_sec32low_end = BUILD_LOWRAM_END zonelow_base = final_sec32low_end - 64*1024 relocdelta = final_sec32low_end - sec32low_end - li.sec32low_start, li.sec32low_align = setSectionsStart( + li.sec32low_start, sec32low_align = setSectionsStart( sections32low, sec32low_end, 16 , segoffset=zonelow_base - relocdelta) li.sec32low_end = sec32low_end @@ -405,6 +409,8 @@ def writeLinkerScripts(li, out16, out32seg, out32flat): if li.config.get('CONFIG_MULTIBOOT'): multiboot_header = "LONG(0x1BADB002) LONG(0) LONG(-0x1BADB002)" sec32all_start -= 3 * 4 + sec32all_align = max([section.align for section in li.sections]) + sec32all_start = aligndown(sec32all_start, sec32all_align) out += outXRefs(filesections32flat, exportsyms=[li.entrysym]) + """ _reloc_min_align = 0x%x ; zonefseg_start = 0x%x ; |