selfhost/cmd/w6l: drop l_* prefix from exports + snake fields/helpers
This commit is contained in:
@@ -23,10 +23,10 @@
|
||||
// [dynamic_off] .dynamic (writable; covered by PT_DYNAMIC)
|
||||
//
|
||||
// cgen workaround notes:
|
||||
// - Two-level field assignments through pointers (e.g. r.sym.is_dyn = 1)
|
||||
// - Two-level field assignments through pointers (e.g. r.sym.isdyn = 1)
|
||||
// silently fail in the current wwstage cgen. We bind the inner
|
||||
// pointer to a local first: `let sym = r.sym; sym.is_dyn = 1;`
|
||||
// - Tuple returns of (i32, str) drop the str payload. l_so_version
|
||||
// pointer to a local first: `let sym = r.sym; sym.isdyn = 1;`
|
||||
// - Tuple returns of (i32, str) drop the str payload. soversion
|
||||
// returns a plain str instead.
|
||||
// - `def NAME: str = "...";` produces a bogus str (len ends up adding
|
||||
// to an offset accumulator). We use a fn returning the literal.
|
||||
@@ -175,19 +175,19 @@ fn str_eq_d(a: str, b: str) bool = {
|
||||
|
||||
// ---- main entry --------------------------------------------------------
|
||||
|
||||
export fn l_emit_dyn_elf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
let a: *arena = l.a;
|
||||
let n: i32 = l.dyn_n;
|
||||
let n: i32 = l.dynn;
|
||||
let nu: u64 = n: u64;
|
||||
|
||||
// ---- collect dyn syms into a plt_idx-indexed array ----
|
||||
let dynsyms: **lsym = amalloc(a, nu * 8u64): **lsym;
|
||||
let s: *lsym = l.syms;
|
||||
for (s != nil) {
|
||||
if (s.is_dyn != 0) {
|
||||
if (s.plt_idx >= 0) {
|
||||
if (s.plt_idx < n) {
|
||||
dynsyms[s.plt_idx] = s;
|
||||
if (s.isdyn != 0) {
|
||||
if (s.pltidx >= 0) {
|
||||
if (s.pltidx < n) {
|
||||
dynsyms[s.pltidx] = s;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -214,7 +214,7 @@ export fn l_emit_dyn_elf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
let j: i32 = 0;
|
||||
for (j < n) {
|
||||
let dsm: *lsym = dynsyms[j];
|
||||
let dl: *lso = dsm.dyn_lib;
|
||||
let dl: *lso = dsm.dynlib;
|
||||
if (dl == so) { used = 1; j = n; }
|
||||
else { j += 1; };
|
||||
};
|
||||
@@ -254,10 +254,10 @@ export fn l_emit_dyn_elf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
let j: i32 = 0;
|
||||
for (j < n) {
|
||||
let dsm: *lsym = dynsyms[j];
|
||||
let dl: *lso = dsm.dyn_lib;
|
||||
let dl: *lso = dsm.dynlib;
|
||||
if (dl == cur_so) {
|
||||
let nm0: str = dsm.name;
|
||||
let dv: str = l_so_version(cur_so, nm0);
|
||||
let dv: str = soversion(cur_so, nm0);
|
||||
if (dv.len > 0) {
|
||||
has = 1; j = n;
|
||||
} else { j += 1; };
|
||||
@@ -270,10 +270,10 @@ export fn l_emit_dyn_elf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
let jj: i32 = 0;
|
||||
for (jj < n) {
|
||||
let dsm2: *lsym = dynsyms[jj];
|
||||
let dl2: *lso = dsm2.dyn_lib;
|
||||
let dl2: *lso = dsm2.dynlib;
|
||||
if (dl2 == cur_so) {
|
||||
let nm2: str = dsm2.name;
|
||||
let vname: str = l_so_version(cur_so, nm2);
|
||||
let vname: str = soversion(cur_so, nm2);
|
||||
if (vname.len > 0) {
|
||||
let seen: i32 = 0;
|
||||
let k: i32 = 0;
|
||||
@@ -387,9 +387,9 @@ export fn l_emit_dyn_elf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
pi = 0;
|
||||
for (pi < n) {
|
||||
let dsm3: *lsym = dynsyms[pi];
|
||||
let dl3: *lso = dsm3.dyn_lib;
|
||||
let dl3: *lso = dsm3.dynlib;
|
||||
let nm3: str = dsm3.name;
|
||||
let vname: str = l_so_version(dl3, nm3);
|
||||
let vname: str = soversion(dl3, nm3);
|
||||
if (vname.len == 0) {
|
||||
d_wr16(versym_for, (pi: u64) * 2u64, VER_NDX_GLOBAL_D);
|
||||
} else {
|
||||
@@ -630,7 +630,7 @@ export fn l_emit_dyn_elf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
for (r != nil) {
|
||||
if (r.sym != nil) {
|
||||
let rsym: *lsym = r.sym;
|
||||
if (rsym.is_dyn != 0) {
|
||||
if (rsym.isdyn != 0) {
|
||||
if (r.kind != R_X86_64_PC32_D) {
|
||||
if (r.kind != R_X86_64_PLT32_D) {
|
||||
os.write(2, "w6l: dynamic reloc kind unsupported\n".ptr, 35u64);
|
||||
@@ -638,7 +638,7 @@ export fn l_emit_dyn_elf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
};
|
||||
};
|
||||
let site: u64 = text_va + r.off;
|
||||
let stub: u64 = plt_va + (rsym.plt_idx: u64) * PLT_STUB_BYTES_D;
|
||||
let stub: u64 = plt_va + (rsym.pltidx: u64) * PLT_STUB_BYTES_D;
|
||||
let disp: i64 = (stub: i64) - (site: i64) + r.addend;
|
||||
d_wr32(l.text, r.off, (disp: i32): u32);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user