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