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:
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