diff --git a/selfhost/cmd/w6l/dyn.ww b/selfhost/cmd/w6l/dyn.ww index 19b1ff90..09d0aad8 100644 --- a/selfhost/cmd/w6l/dyn.ww +++ b/selfhost/cmd/w6l/dyn.ww @@ -326,22 +326,20 @@ export fn loadso(l: *lnk, path: *u8) i32 = { keep = 0; // non-default } else { let vidx: u16 = v & VERSYM_VERSION_C; - if (vidx == VER_NDX_LOCAL_C) { + switch (vidx) { + case VER_NDX_LOCAL_C: keep = 0; // not exported - } else { if (vidx == VER_NDX_GLOBAL_C) { + case VER_NDX_GLOBAL_C,1u16: + // glibc's BASE entry (vidx==1): treat as + // unversioned. (The C version notes that + // vidx==1 in Verdef maps to the SONAME BASE.) vernamecs = nil; - } else { if (vidx == 1u16) { - // glibc's BASE entry: treat as - // unversioned. (The C version - // notes that vidx==1 in Verdef - // maps to the SONAME BASE.) - vernamecs = nil; - } else { + case: if (verstr != nil) { let nm: *u8 = vdnameat(buf, verdefoff, verdefsize, verstr, vidx); vernamecs = nm; }; - }; }; }; + }; }; }; diff --git a/selfhost/cmd/w6l/main.combined.ww b/selfhost/cmd/w6l/main.combined.ww index 10dbffa5..129d09b1 100644 --- a/selfhost/cmd/w6l/main.combined.ww +++ b/selfhost/cmd/w6l/main.combined.ww @@ -3888,22 +3888,20 @@ export fn loadso(l: *lnk, path: *u8) i32 = { keep = 0; // non-default } else { let vidx: u16 = v & VERSYM_VERSION_C; - if (vidx == VER_NDX_LOCAL_C) { + switch (vidx) { + case VER_NDX_LOCAL_C: keep = 0; // not exported - } else { if (vidx == VER_NDX_GLOBAL_C) { + case VER_NDX_GLOBAL_C,1u16: + // glibc's BASE entry (vidx==1): treat as + // unversioned. (The C version notes that + // vidx==1 in Verdef maps to the SONAME BASE.) vernamecs = nil; - } else { if (vidx == 1u16) { - // glibc's BASE entry: treat as - // unversioned. (The C version - // notes that vidx==1 in Verdef - // maps to the SONAME BASE.) - vernamecs = nil; - } else { + case: if (verstr != nil) { let nm: *u8 = vdnameat(buf, verdefoff, verdefsize, verstr, vidx); vernamecs = nm; }; - }; }; }; + }; }; }; @@ -4074,15 +4072,12 @@ export fn relocate(l: *lnk, textva: u64, datava: u64) i32 = { let symva: u64 = textva + r.sym.val; if (r.sym.indata != 0) { symva = datava + r.sym.val; }; let k: i32 = r.kind; - if (k == R_X86_64_PC32) { + switch (k) { + case R_X86_64_PC32,R_X86_64_PLT32: let site: u64 = textva + r.off; let rel: i64 = (symva: i64 - site: i64) + r.addend; patchu32(l.text + r.off, rel: u32); - } else { if (k == R_X86_64_PLT32) { - let site: u64 = textva + r.off; - let rel: i64 = (symva: i64 - site: i64) + r.addend; - patchu32(l.text + r.off, rel: u32); - } else { if (k == R_X86_64_64) { + case R_X86_64_64: // Absolute 64-bit. Currently used only // for DATAR slots in .data. let v: u64 = (symva: i64 + r.addend): u64; @@ -4091,10 +4086,10 @@ export fn relocate(l: *lnk, textva: u64, datava: u64) i32 = { } else { patchu64(l.text + r.off, v); }; - } else { + case: os.write(2, "w6l: unsupported reloc kind\n".ptr, 27u64); l.errs += 1; - };};}; + }; }; }; r = r.rnext; diff --git a/selfhost/cmd/w6l/pass.ww b/selfhost/cmd/w6l/pass.ww index 928e883d..dae017c0 100644 --- a/selfhost/cmd/w6l/pass.ww +++ b/selfhost/cmd/w6l/pass.ww @@ -105,15 +105,12 @@ export fn relocate(l: *lnk, textva: u64, datava: u64) i32 = { let symva: u64 = textva + r.sym.val; if (r.sym.indata != 0) { symva = datava + r.sym.val; }; let k: i32 = r.kind; - if (k == R_X86_64_PC32) { + switch (k) { + case R_X86_64_PC32,R_X86_64_PLT32: let site: u64 = textva + r.off; let rel: i64 = (symva: i64 - site: i64) + r.addend; patchu32(l.text + r.off, rel: u32); - } else { if (k == R_X86_64_PLT32) { - let site: u64 = textva + r.off; - let rel: i64 = (symva: i64 - site: i64) + r.addend; - patchu32(l.text + r.off, rel: u32); - } else { if (k == R_X86_64_64) { + case R_X86_64_64: // Absolute 64-bit. Currently used only // for DATAR slots in .data. let v: u64 = (symva: i64 + r.addend): u64; @@ -122,10 +119,10 @@ export fn relocate(l: *lnk, textva: u64, datava: u64) i32 = { } else { patchu64(l.text + r.off, v); }; - } else { + case: os.write(2, "w6l: unsupported reloc kind\n".ptr, 27u64); l.errs += 1; - };};}; + }; }; }; r = r.rnext;