selfhost/cmd/w6l: drop l_* prefix from exports + snake fields/helpers

This commit is contained in:
2026-05-11 14:34:11 +09:00
parent f250bcfb3a
commit fce0a54d62
8 changed files with 334 additions and 370 deletions

View File

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