toolchain: banner purge + WHY-only comment sweep (rule 8)
selfhost/, cmd/, internal/ join the tree-wide sweep: every section banner dies (91 selfhost + the cmd C-style dividers -> 0); narration and stale contracts deleted (pre-#22 bundler notes, retired single-PT_LOAD and no-archive claims, superseded ABI tables); every ref/harec/qbe cite, task cite, encoding/ELF contract, and rule-10 twin pointer kept; lost lifetime/rationale lines restored where the sweep over-cut (elf_globals ownership, kwtab linear-scan). Comment- only proven: all five wwstage tool binaries byte-identical across the sweep; test-commit, test-byteid (161+1399, 0 pinned-divergent), and test-bootstrap (fixed point + 991-995 byte-id) all exit 0. The read-through banked 66 latent-bug leads (checkpoint).
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
// selfhost/cmd/w6l/dynout.ww — port of cmd/w6l/dynout.c.
|
||||
// Port of cmd/w6l/dynout.c.
|
||||
//
|
||||
// Emit a dynamic-linked ELF executable. The shape is the simplest
|
||||
// valid one: PT_INTERP + PT_DYNAMIC + DT_BIND_NOW so the loader
|
||||
@@ -29,7 +29,6 @@ import rt;
|
||||
import strings;
|
||||
import sym;
|
||||
|
||||
// ELF constants
|
||||
def ET_EXEC_D: u16 = 2u16;
|
||||
def EM_X86_64_D: u16 = 62u16;
|
||||
def EV_CURRENT_D: u32 = 1u32;
|
||||
@@ -75,8 +74,6 @@ def PAGE: u64 = 4096u64;
|
||||
|
||||
def INTERP: str = "/lib64/ld-linux-x86-64.so.2";
|
||||
|
||||
// ---- byte writers ------------------------------------------------------
|
||||
|
||||
fn dwr8(buf: *u8, off: u64, v: u8) void = {
|
||||
buf[off] = v;
|
||||
};
|
||||
@@ -106,8 +103,6 @@ fn dwri32(buf: *u8, off: u64, v: i32) void = {
|
||||
dwr32(buf, off, v: u32);
|
||||
};
|
||||
|
||||
// ---- byte readers ------------------------------------------------------
|
||||
|
||||
fn drdu16(p: *u8, off: u64) u16 = {
|
||||
let b0: u16 = p[off]: u16;
|
||||
let b1: u16 = p[off + 1u64]: u16;
|
||||
@@ -153,8 +148,6 @@ fn alignup(off: u64, a: u64) u64 = {
|
||||
return (off + a - 1u64) & ~(a - 1u64);
|
||||
};
|
||||
|
||||
// ---- main entry --------------------------------------------------------
|
||||
|
||||
export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
// .data shares the R+W PT_LOAD with .got.plt and .dynamic.
|
||||
// Placed after .dynamic so the segment is one contiguous run;
|
||||
@@ -163,7 +156,6 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
let n: i32 = l.dynn;
|
||||
let nu: u64 = n: u64;
|
||||
|
||||
// ---- collect dyn syms into a plt_idx-indexed array ----
|
||||
let dynsyms: []*lsym = alloc([], nu)!;
|
||||
let s: *lsym = l.syms;
|
||||
for (s != nil) {
|
||||
@@ -185,7 +177,7 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
i += 1;
|
||||
};
|
||||
|
||||
// ---- collect used .so's (in l.sos order) ----
|
||||
// Used .so's are collected in l.sos order.
|
||||
let maxsos: i32 = 0;
|
||||
let so: *lso = l.sos;
|
||||
for (so != nil) { maxsos += 1; so = so.sonext; };
|
||||
@@ -208,7 +200,7 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
so = so.sonext;
|
||||
};
|
||||
|
||||
// ---- build flat version table grouped by vlib ----
|
||||
// Flat version table grouped by vlib:
|
||||
// vlib_sos_idx[k] = sos_used index for vlib k.
|
||||
// vlib_first[k] = ver index of first version under vlib k.
|
||||
// vlib_count[k] = number of versions under vlib k.
|
||||
@@ -301,7 +293,6 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
vi += 1;
|
||||
};
|
||||
|
||||
// ---- compute dynstr size ----
|
||||
let dynstrsz: u64 = 1u64; // leading NUL
|
||||
let pi: i32 = 0;
|
||||
for (pi < nsos) {
|
||||
@@ -325,7 +316,6 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
pi += 1;
|
||||
};
|
||||
|
||||
// ---- fill dynstr ----
|
||||
let dynstr: []u8 = alloc([], dynstrsz)!;
|
||||
let dynstrpos: u64 = 1u64; // past leading NUL
|
||||
|
||||
@@ -365,7 +355,6 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
pi += 1;
|
||||
};
|
||||
|
||||
// ---- per-dyn-sym versym index ----
|
||||
let versymfor: []u8 = alloc([], nu * 2u64)!;
|
||||
pi = 0;
|
||||
for (pi < n) {
|
||||
@@ -400,7 +389,6 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
pi += 1;
|
||||
};
|
||||
|
||||
// ---- compute byte sizes ----
|
||||
let ehdrsz: u64 = 64u64;
|
||||
let nphdrs: u64 = 4u64;
|
||||
let phdrsz: u64 = nphdrs * 56u64;
|
||||
@@ -433,7 +421,6 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
let ndyn: u64 = (nsos: u64) + 11u64 + extra;
|
||||
let dynamicsz: u64 = ndyn * 16u64;
|
||||
|
||||
// ---- compute file offsets ----
|
||||
let off: u64 = ehdrsz + phdrsz;
|
||||
let interpoff: u64 = off; off += interpsz;
|
||||
off = alignup(off, 8u64);
|
||||
@@ -486,7 +473,6 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
let datafilelen: u64 = l.datalen - bsslen;
|
||||
let filedataend: u64 = dataoff + datafilelen;
|
||||
|
||||
// ---- build .dynsym ----
|
||||
let dynsymbuf: []u8 = alloc([], dynsymsz)!;
|
||||
pi = 0;
|
||||
for (pi < n) {
|
||||
@@ -500,7 +486,7 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
pi += 1;
|
||||
};
|
||||
|
||||
// ---- build .hash (SysV, 1 bucket) ----
|
||||
// .hash is SysV with a single bucket.
|
||||
let hashbuf: []u8 = alloc([], hashsz)!;
|
||||
dwr32(hashbuf.ptr, 0u64, nbuckets);
|
||||
dwr32(hashbuf.ptr, 4u64, nchain);
|
||||
@@ -515,7 +501,6 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
ci += 1u64;
|
||||
};
|
||||
|
||||
// ---- build .rela.plt ----
|
||||
let relapltbuf: []u8 = alloc([], relapltsz)!;
|
||||
pi = 0;
|
||||
for (pi < n) {
|
||||
@@ -527,7 +512,7 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
pi += 1;
|
||||
};
|
||||
|
||||
// ---- build .gnu.version (u16 per dynsym entry) ----
|
||||
// .gnu.version is one u16 per dynsym entry.
|
||||
let versymbuf: []u8 = alloc([], versymsz)!;
|
||||
dwr16(versymbuf.ptr, 0u64, VER_NDX_LOCAL_D);
|
||||
pi = 0;
|
||||
@@ -536,7 +521,6 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
pi += 1;
|
||||
};
|
||||
|
||||
// ---- build .gnu.version_r ----
|
||||
let verneedbuf: []u8 = alloc([], verneedsz)!;
|
||||
if (verneedsz > 0u64) {
|
||||
let vnoff: u64 = 0u64;
|
||||
@@ -575,7 +559,6 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
};
|
||||
};
|
||||
|
||||
// ---- build .plt ----
|
||||
let pltbuf: []u8 = alloc([], pltsz)!;
|
||||
pi = 0;
|
||||
for (pi < n) {
|
||||
@@ -590,11 +573,9 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
pi += 1;
|
||||
};
|
||||
|
||||
// ---- build .got.plt ----
|
||||
let gotpltbuf: []u8 = alloc([], gotpltsz)!;
|
||||
dwr64(gotpltbuf.ptr, 0u64, dynamicva);
|
||||
|
||||
// ---- build .dynamic ----
|
||||
let dynamicbuf: []u8 = alloc([], dynamicsz)!;
|
||||
let dk: u64 = 0u64;
|
||||
pi = 0;
|
||||
@@ -625,7 +606,6 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
return 1;
|
||||
};
|
||||
|
||||
// ---- patch .text relocs targeting dynamic syms ----
|
||||
let r: *lrel = l.rels;
|
||||
for (r != nil) {
|
||||
if (r.sym != nil) {
|
||||
@@ -646,7 +626,6 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
r = r.rnext;
|
||||
};
|
||||
|
||||
// ---- assemble file buffer ----
|
||||
let filebuf: []u8 = alloc([], fileend)!;
|
||||
filebuf.len = fileend: i32;
|
||||
|
||||
@@ -721,7 +700,6 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
dwr64(filebuf.ptr, p3 + 40u64, dynamicsz);
|
||||
dwr64(filebuf.ptr, p3 + 48u64, 8u64);
|
||||
|
||||
// Sections.
|
||||
dbcopy(filebuf.ptr, interpoff, INTERP.ptr, INTERP.len: u64);
|
||||
dwr8(filebuf.ptr, interpoff + (INTERP.len: u64), 0u8);
|
||||
dbcopy(filebuf.ptr, dynstroff, dynstr.ptr, dynstrsz);
|
||||
|
||||
Reference in New Issue
Block a user