selfhost/cmd/w6l: drop l_* prefix from exports + snake fields/helpers
This commit is contained in:
@@ -17,14 +17,14 @@ use dyn;
|
||||
def R_X86_64_PC32: i32 = 2;
|
||||
def R_X86_64_PLT32: i32 = 4;
|
||||
|
||||
export fn l_resolve(l: *lnk) i32 = {
|
||||
export fn resolve(l: *lnk) i32 = {
|
||||
// Initialise dynamic-linking sentinels. amalloc zeroes, so
|
||||
// is_dyn/dyn_lib start clean — but plt_idx and dynsym_idx
|
||||
// isdyn/dynlib start clean — but pltidx and dynsymidx
|
||||
// must be -1, not 0.
|
||||
let si: *lsym = l.syms;
|
||||
for (si != nil) {
|
||||
si.plt_idx = -1;
|
||||
si.dynsym_idx = -1;
|
||||
si.pltidx = -1;
|
||||
si.dynsymidx = -1;
|
||||
si = si.snext;
|
||||
};
|
||||
|
||||
@@ -36,14 +36,14 @@ export fn l_resolve(l: *lnk) i32 = {
|
||||
if (r.sym != nil) {
|
||||
if (r.sym.defined == 0) {
|
||||
let sym: *lsym = r.sym;
|
||||
if (sym.is_dyn == 0) {
|
||||
if (sym.isdyn == 0) {
|
||||
let so: *lso = l.sos;
|
||||
for (so != nil) {
|
||||
if (l_so_provides(so, sym.name) != 0) {
|
||||
sym.is_dyn = 1;
|
||||
sym.dyn_lib = so;
|
||||
sym.plt_idx = l.dyn_n;
|
||||
l.dyn_n += 1;
|
||||
if (soprovides(so, sym.name) != 0) {
|
||||
sym.isdyn = 1;
|
||||
sym.dynlib = so;
|
||||
sym.pltidx = l.dynn;
|
||||
l.dynn += 1;
|
||||
so = nil; // break
|
||||
} else {
|
||||
so = so.sonext;
|
||||
@@ -60,7 +60,7 @@ export fn l_resolve(l: *lnk) i32 = {
|
||||
for (r2 != nil) {
|
||||
if (r2.sym != nil) {
|
||||
if (r2.sym.defined == 0) {
|
||||
if (r2.sym.is_dyn == 0) {
|
||||
if (r2.sym.isdyn == 0) {
|
||||
os.write(2, "w6l: undefined reference to '".ptr, 28u64);
|
||||
let nm: str = r2.sym.name;
|
||||
os.write(2, nm.ptr, nm.len: u64);
|
||||
@@ -74,20 +74,20 @@ export fn l_resolve(l: *lnk) i32 = {
|
||||
return l.errs;
|
||||
};
|
||||
|
||||
fn patch_u32(p: *u8, v: u32) void = {
|
||||
fn patchu32(p: *u8, v: u32) void = {
|
||||
p[0] = (v & 255u32): u8;
|
||||
p[1] = ((v >> 8u32) & 255u32): u8;
|
||||
p[2] = ((v >> 16u32) & 255u32): u8;
|
||||
p[3] = ((v >> 24u32) & 255u32): u8;
|
||||
};
|
||||
|
||||
export fn l_relocate(l: *lnk, base: u64) i32 = {
|
||||
export fn relocate(l: *lnk, base: u64) i32 = {
|
||||
let r: *lrel = l.rels;
|
||||
for (r != nil) {
|
||||
if (r.sym != nil) {
|
||||
// Dynamic refs are patched later in dynout once the
|
||||
// PLT vaddr is known.
|
||||
if (r.sym.is_dyn != 0) {
|
||||
if (r.sym.isdyn != 0) {
|
||||
r = r.rnext;
|
||||
continue;
|
||||
};
|
||||
@@ -97,12 +97,12 @@ export fn l_relocate(l: *lnk, base: u64) i32 = {
|
||||
let site: u64 = base + r.off;
|
||||
let target: i64 = (base + r.sym.val): i64;
|
||||
let rel: i64 = (target - site: i64) + r.addend;
|
||||
patch_u32(l.text + r.off, rel: u32);
|
||||
patchu32(l.text + r.off, rel: u32);
|
||||
} else { if (k == R_X86_64_PLT32) {
|
||||
let site: u64 = base + r.off;
|
||||
let target: i64 = (base + r.sym.val): i64;
|
||||
let rel: i64 = (target - site: i64) + r.addend;
|
||||
patch_u32(l.text + r.off, rel: u32);
|
||||
patchu32(l.text + r.off, rel: u32);
|
||||
} else {
|
||||
os.write(2, "w6l: unsupported reloc kind\n".ptr, 27u64);
|
||||
l.errs += 1;
|
||||
|
||||
Reference in New Issue
Block a user