commit 3499424fbf006dd515ad568fbe3e6f5907119437
parent 6a97a84ce5ab1c6b9b2c19618cb7f535fe25a725
Author: Ryan Sepassi <rsepassi@gmail.com>
Date: Tue, 19 May 2026 16:02:19 -0700
Fix Mach-O section name pointers during sort
Diffstat:
1 file changed, 8 insertions(+), 0 deletions(-)
diff --git a/src/link/link_macho.c b/src/link/link_macho.c
@@ -219,6 +219,11 @@ typedef struct MSec {
u8 pad[6];
} MSec;
+static void msec_repair_name_ptrs(MSec* m) {
+ if (m->segname_buf[0]) m->segname = m->segname_buf;
+ if (m->sectname_buf[0]) m->sectname = m->sectname_buf;
+}
+
typedef struct MSeg {
const char* name;
u32 maxprot;
@@ -846,6 +851,7 @@ static void plan_layout(MCtx* x) {
u32 n = sg->nsects;
for (u32 a = 1; a < n; ++a) {
MSec key = x->secs[base + a];
+ msec_repair_name_ptrs(&key);
u32 j = a;
while (j > 0) {
MSec* prev = &x->secs[base + j - 1];
@@ -853,9 +859,11 @@ static void plan_layout(MCtx* x) {
if (cmp == 0) cmp = strcmp(prev->sectname, key.sectname);
if (cmp <= 0) break;
x->secs[base + j] = x->secs[base + j - 1];
+ msec_repair_name_ptrs(&x->secs[base + j]);
--j;
}
x->secs[base + j] = key;
+ msec_repair_name_ptrs(&x->secs[base + j]);
}
}