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
|
keep = 0; // non-default
|
||||||
} else {
|
} else {
|
||||||
let vidx: u16 = v & VERSYM_VERSION_C;
|
let vidx: u16 = v & VERSYM_VERSION_C;
|
||||||
if (vidx == VER_NDX_LOCAL_C) {
|
switch (vidx) {
|
||||||
|
case VER_NDX_LOCAL_C:
|
||||||
keep = 0; // not exported
|
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;
|
vernamecs = nil;
|
||||||
} else { if (vidx == 1u16) {
|
case:
|
||||||
// glibc's BASE entry: treat as
|
|
||||||
// unversioned. (The C version
|
|
||||||
// notes that vidx==1 in Verdef
|
|
||||||
// maps to the SONAME BASE.)
|
|
||||||
vernamecs = nil;
|
|
||||||
} else {
|
|
||||||
if (verstr != nil) {
|
if (verstr != nil) {
|
||||||
let nm: *u8 = vdnameat(buf, verdefoff, verdefsize, verstr, vidx);
|
let nm: *u8 = vdnameat(buf, verdefoff, verdefsize, verstr, vidx);
|
||||||
vernamecs = nm;
|
vernamecs = nm;
|
||||||
};
|
};
|
||||||
}; }; };
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -3888,22 +3888,20 @@ export fn loadso(l: *lnk, path: *u8) i32 = {
|
|||||||
keep = 0; // non-default
|
keep = 0; // non-default
|
||||||
} else {
|
} else {
|
||||||
let vidx: u16 = v & VERSYM_VERSION_C;
|
let vidx: u16 = v & VERSYM_VERSION_C;
|
||||||
if (vidx == VER_NDX_LOCAL_C) {
|
switch (vidx) {
|
||||||
|
case VER_NDX_LOCAL_C:
|
||||||
keep = 0; // not exported
|
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;
|
vernamecs = nil;
|
||||||
} else { if (vidx == 1u16) {
|
case:
|
||||||
// glibc's BASE entry: treat as
|
|
||||||
// unversioned. (The C version
|
|
||||||
// notes that vidx==1 in Verdef
|
|
||||||
// maps to the SONAME BASE.)
|
|
||||||
vernamecs = nil;
|
|
||||||
} else {
|
|
||||||
if (verstr != nil) {
|
if (verstr != nil) {
|
||||||
let nm: *u8 = vdnameat(buf, verdefoff, verdefsize, verstr, vidx);
|
let nm: *u8 = vdnameat(buf, verdefoff, verdefsize, verstr, vidx);
|
||||||
vernamecs = nm;
|
vernamecs = nm;
|
||||||
};
|
};
|
||||||
}; }; };
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -4074,15 +4072,12 @@ export fn relocate(l: *lnk, textva: u64, datava: u64) i32 = {
|
|||||||
let symva: u64 = textva + r.sym.val;
|
let symva: u64 = textva + r.sym.val;
|
||||||
if (r.sym.indata != 0) { symva = datava + r.sym.val; };
|
if (r.sym.indata != 0) { symva = datava + r.sym.val; };
|
||||||
let k: i32 = r.kind;
|
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 site: u64 = textva + r.off;
|
||||||
let rel: i64 = (symva: i64 - site: i64) + r.addend;
|
let rel: i64 = (symva: i64 - site: i64) + r.addend;
|
||||||
patchu32(l.text + r.off, rel: u32);
|
patchu32(l.text + r.off, rel: u32);
|
||||||
} else { if (k == R_X86_64_PLT32) {
|
case R_X86_64_64:
|
||||||
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) {
|
|
||||||
// Absolute 64-bit. Currently used only
|
// Absolute 64-bit. Currently used only
|
||||||
// for DATAR slots in .data.
|
// for DATAR slots in .data.
|
||||||
let v: u64 = (symva: i64 + r.addend): u64;
|
let v: u64 = (symva: i64 + r.addend): u64;
|
||||||
@@ -4091,10 +4086,10 @@ export fn relocate(l: *lnk, textva: u64, datava: u64) i32 = {
|
|||||||
} else {
|
} else {
|
||||||
patchu64(l.text + r.off, v);
|
patchu64(l.text + r.off, v);
|
||||||
};
|
};
|
||||||
} else {
|
case:
|
||||||
os.write(2, "w6l: unsupported reloc kind\n".ptr, 27u64);
|
os.write(2, "w6l: unsupported reloc kind\n".ptr, 27u64);
|
||||||
l.errs += 1;
|
l.errs += 1;
|
||||||
};};};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
r = r.rnext;
|
r = r.rnext;
|
||||||
|
|||||||
@@ -105,15 +105,12 @@ export fn relocate(l: *lnk, textva: u64, datava: u64) i32 = {
|
|||||||
let symva: u64 = textva + r.sym.val;
|
let symva: u64 = textva + r.sym.val;
|
||||||
if (r.sym.indata != 0) { symva = datava + r.sym.val; };
|
if (r.sym.indata != 0) { symva = datava + r.sym.val; };
|
||||||
let k: i32 = r.kind;
|
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 site: u64 = textva + r.off;
|
||||||
let rel: i64 = (symva: i64 - site: i64) + r.addend;
|
let rel: i64 = (symva: i64 - site: i64) + r.addend;
|
||||||
patchu32(l.text + r.off, rel: u32);
|
patchu32(l.text + r.off, rel: u32);
|
||||||
} else { if (k == R_X86_64_PLT32) {
|
case R_X86_64_64:
|
||||||
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) {
|
|
||||||
// Absolute 64-bit. Currently used only
|
// Absolute 64-bit. Currently used only
|
||||||
// for DATAR slots in .data.
|
// for DATAR slots in .data.
|
||||||
let v: u64 = (symva: i64 + r.addend): u64;
|
let v: u64 = (symva: i64 + r.addend): u64;
|
||||||
@@ -122,10 +119,10 @@ export fn relocate(l: *lnk, textva: u64, datava: u64) i32 = {
|
|||||||
} else {
|
} else {
|
||||||
patchu64(l.text + r.off, v);
|
patchu64(l.text + r.off, v);
|
||||||
};
|
};
|
||||||
} else {
|
case:
|
||||||
os.write(2, "w6l: unsupported reloc kind\n".ptr, 27u64);
|
os.write(2, "w6l: unsupported reloc kind\n".ptr, 27u64);
|
||||||
l.errs += 1;
|
l.errs += 1;
|
||||||
};};};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
r = r.rnext;
|
r = r.rnext;
|
||||||
|
|||||||
Reference in New Issue
Block a user