phase 5
This commit is contained in:
@@ -125,6 +125,15 @@ addresses read from core's exported data-symbol globals) → instantiate →
|
||||
patch deferred GOT entries → `__wasm_apply_data_relocs` → `__wasm_call_ctors`
|
||||
→ call the entry export.
|
||||
|
||||
- **Erratum (found in Phase 3): self-resolved `GOT.mem` values must add
|
||||
`__memory_base`.** A PIC module's exported data symbols are i32 globals
|
||||
holding offsets *relative to its `__memory_base`*, not absolute addresses —
|
||||
the linker adds the base when patching deferred GOT entries (there is no
|
||||
`__wasm_apply_global_relocs` export to do it). Copying the export verbatim
|
||||
reads/writes core memory at low addresses and renders silently wrong values;
|
||||
the Phase 3 fixture's `self-got`/`callback` markers exist to catch exactly
|
||||
this. `GOT.mem` entries resolved from the *core's* exports are absolute
|
||||
already (the core is non-PIC) and need no adjustment.
|
||||
- **GOT.func is resolved guest-side**: the core exports a helper returning
|
||||
`(intptr_t)&func` — taking the address forces a link-time elem entry and a
|
||||
wasm function pointer *is* its table index. No host-side funcref injection
|
||||
|
||||
@@ -394,9 +394,11 @@ int main(int argc, char** argv)
|
||||
CHECK(own, "GOT.mem.%s defined neither by core nor by unit", nm.c_str());
|
||||
wasm_val_t v;
|
||||
wasm_global_get(own, &v);
|
||||
wasm_val_t nv = WASM_I32_VAL(v.of.i32);
|
||||
// dylink ABI: a PIC module's exported data symbols are offsets relative
|
||||
// to its __memory_base; the linker must add the base when resolving
|
||||
wasm_val_t nv = WASM_I32_VAL(memory_base + v.of.i32);
|
||||
wasm_global_set(got, &nv);
|
||||
printf("self-resolved GOT.mem.%s = %d\n", nm.c_str(), v.of.i32);
|
||||
printf("self-resolved GOT.mem.%s = %d (offset %d)\n", nm.c_str(), memory_base + v.of.i32, v.of.i32);
|
||||
}
|
||||
|
||||
if(unit.func("__wasm_apply_data_relocs"))
|
||||
|
||||
Reference in New Issue
Block a user