w6l: pass reloc-kind + dyn vidx if-ladders -> switch (Wave-2 structural)
relocate() reloc-kind ladder -> switch(k): PC32+PLT32 share a byte-identical body (comma-case), R_X86_64_64 absolute, default = unsupported-reloc errs+=1. loadso() vidx ladder -> switch(vidx): LOCAL not-exported, GLOBAL+BASE(1) unversioned (comma-case), default = verdef name lookup. Regenerated w6l/main.combined.ww.
This commit is contained in:
@@ -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;
|
||||
};
|
||||
}; }; };
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user