w6l: link GNU long-name archive members; bad members fail the link
The archive walk skipped every member whose header name starts with '/', which also dropped GNU long-name members (/N) -- any member with a >15-char filename silently never linked. Only '/ ' (symbol index) and '//' (long-name table) are non-objects; /N members index by content (names are never consulted). A member that fails loadimage in the selective pull also stayed silently unlinked with rc=0; it now reports and fails the link (rule 7). wwstage w6l diagnostics ride the same .len idiom as the w6a sweep.
This commit is contained in:
@@ -56,10 +56,12 @@ export fn resolve(l: *lnk) i32 = {
|
||||
if (r2.sym != nil) {
|
||||
if (r2.sym.defined == 0) {
|
||||
if (r2.sym.isdyn == 0) {
|
||||
os.write(2, "w6l: undefined reference to '".ptr, 28u64);
|
||||
let wm1: str = "w6l: undefined reference to '";
|
||||
os.write(2, wm1.ptr, wm1.len: u64);
|
||||
let nm: str = r2.sym.name;
|
||||
os.write(2, nm.ptr, nm.len: u64);
|
||||
os.write(2, "'\n".ptr, 2u64);
|
||||
let wm2: str = "'\n";
|
||||
os.write(2, wm2.ptr, wm2.len: u64);
|
||||
l.errs += 1;
|
||||
};
|
||||
};
|
||||
@@ -113,7 +115,8 @@ export fn relocate(l: *lnk, textva: u64, datava: u64) i32 = {
|
||||
patchu64(l.text + r.off, v);
|
||||
};
|
||||
case:
|
||||
os.write(2, "w6l: unsupported reloc kind\n".ptr, 27u64);
|
||||
let wm3: str = "w6l: unsupported reloc kind\n";
|
||||
os.write(2, wm3.ptr, wm3.len: u64);
|
||||
l.errs += 1;
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user