kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

commit 75b48f7fe468c2c4455f5451667ed023891a28a6
parent fcdfd6add1105d14982e257898aae2672d94cfbf
Author: Ryan Sepassi <rsepassi@gmail.com>
Date:   Tue, 16 Jun 2026 11:38:08 -0700

Fix scripted alignment for bare aa64 smoke

Diffstat:
Msrc/arch/mc.c | 4++++
Msrc/link/link_layout.c | 33+++++++++++++++++++++++++++++++++
Mtest/lib/exec_bare.sh | 8++++----
3 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/src/arch/mc.c b/src/arch/mc.c @@ -381,7 +381,11 @@ void mc_emit_fill(MCEmitter* m, size_t n, u8 byte) { } void mc_emit_align(MCEmitter* m, u32 align, u8 fill) { + const Section* s; if (align <= 1) return; + s = obj_section_get(m->obj, m->section_id); + if (s && align > s->align) + obj_section_set_align(m->obj, m->section_id, align); u32 cur = obj_pos(m->obj, m->section_id); u32 misalign = cur & (align - 1); if (misalign == 0) return; diff --git a/src/link/link_layout.c b/src/link/link_layout.c @@ -709,6 +709,37 @@ static int input_match_section(const KitLinkInputMatch* m, const char* nm) { return match_glob(m->section_pattern.s, nm); } +static u32 script_output_input_align(Linker* l, LinkImage* img, + const GcLive* g, + const KitLinkOutputSection* os, + u8** claimed) { + u32 align_max = 1; + u32 mi, ii, j; + for (mi = 0; mi < os->ninputs; ++mi) { + const KitLinkInputMatch* im = &os->inputs[mi]; + for (ii = 0; ii < LinkInputs_count(&l->inputs); ++ii) { + ObjBuilder* ob = LinkInputs_at(&l->inputs, ii)->obj; + InputMap* m = &img->input_maps[ii]; + for (j = 1; j < obj_section_count(ob); ++j) { + const Section* s; + const char* nm; + u32 align; + if (claimed[ii][j]) continue; + if (m->comdat_discarded[j]) continue; + s = obj_section_get(ob, j); + if (!s || !link_section_kept(s)) continue; + nm = pool_slice(l->c->global, s->name).s; + if (!nm) continue; + if (!input_match_section(im, nm)) continue; + if (!live_section_units(g, m, ii, ob, j)) continue; + align = s->align ? s->align : 1u; + if (align > align_max) align_max = align; + } + } + } + return align_max; +} + static void link_layout_sections_scripted(Linker* l, LinkImage* img, const GcLive* g) { Heap* h = img->heap; @@ -819,6 +850,8 @@ static void link_layout_sections_scripted(Linker* l, LinkImage* img, u32 nsec_in_seg = 0; u32 first_section_idx = img->nsections; + align_max = script_output_input_align(l, img, g, os, claimed); + dot = ALIGN_UP(dot, (u64)align_max); for (k = 0; k < os->nasns; ++k) { apply_asn(l, img, &dot, &os->asns[k]); } diff --git a/test/lib/exec_bare.sh b/test/lib/exec_bare.sh @@ -206,10 +206,10 @@ EOF ENTRY(_start) SECTIONS { . = 0x40080000; - .text : { *(.text.start) *(.text*) } - .rodata : { *(.rodata*) } - .data : { *(.data*) } - .bss : { *(.bss*) *(COMMON) } + .text : ALIGN(8) { *(.text.start) *(.text*) } + .rodata : ALIGN(8) { *(.rodata*) } + .data : ALIGN(8) { *(.data*) } + .bss : ALIGN(16) { *(.bss*) *(COMMON) . = ALIGN(., 16); } /DISCARD/ : { *(.comment) } } EOF