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:
@@ -171,7 +171,8 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
let i: i32 = 0;
|
||||
for (i < n) {
|
||||
if (dynsyms[i] == nil) {
|
||||
os.write(2, "w6l: dynout: no sym for plt_idx\n".ptr, 31u64);
|
||||
let wm1: str = "w6l: dynout: no sym for plt_idx\n";
|
||||
os.write(2, wm1.ptr, wm1.len: u64);
|
||||
return 1;
|
||||
};
|
||||
i += 1;
|
||||
@@ -602,7 +603,8 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
};
|
||||
dwri64(dynamicbuf.ptr, dk * 16u64, DT_NULL); dwr64(dynamicbuf.ptr, dk * 16u64 + 8u64, 0u64); dk += 1u64;
|
||||
if (dk != ndyn) {
|
||||
os.write(2, "w6l: dynamic entry count mismatch\n".ptr, 33u64);
|
||||
let wm2: str = "w6l: dynamic entry count mismatch\n";
|
||||
os.write(2, wm2.ptr, wm2.len: u64);
|
||||
return 1;
|
||||
};
|
||||
|
||||
@@ -613,7 +615,8 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
|
||||
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);
|
||||
let wm3: str = "w6l: dynamic reloc kind unsupported\n";
|
||||
os.write(2, wm3.ptr, wm3.len: u64);
|
||||
return 1;
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user