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:
@@ -168,11 +168,13 @@ export fn loadso(l: *lnk, path: *u8) i32 = {
|
||||
let blen: u64;
|
||||
buf, blen = slurpso(path);
|
||||
if (buf == nil) {
|
||||
os.write(2, "w6l: cannot read .so\n".ptr, 20u64);
|
||||
let wm1: str = "w6l: cannot read .so\n";
|
||||
os.write(2, wm1.ptr, wm1.len: u64);
|
||||
return -1;
|
||||
};
|
||||
if (blen < 64u64) {
|
||||
os.write(2, "w6l: short ELF\n".ptr, 14u64);
|
||||
let wm2: str = "w6l: short ELF\n";
|
||||
os.write(2, wm2.ptr, wm2.len: u64);
|
||||
return -1;
|
||||
};
|
||||
if (buf[0u64] != 127u8) { return soerr("not ELF"); };
|
||||
@@ -349,9 +351,11 @@ export fn loadso(l: *lnk, path: *u8) i32 = {
|
||||
};
|
||||
|
||||
fn soerr(msg: str) i32 = {
|
||||
os.write(2, "w6l: ".ptr, 4u64);
|
||||
let wm3: str = "w6l: ";
|
||||
os.write(2, wm3.ptr, wm3.len: u64);
|
||||
os.write(2, msg.ptr, msg.len: u64);
|
||||
os.write(2, "\n".ptr, 1u64);
|
||||
let wm4: str = "\n";
|
||||
os.write(2, wm4.ptr, wm4.len: u64);
|
||||
return -1;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user