diff --git a/test/test_core.py b/test/test_core.py index ecb4917ecfbc9..aceca825ff988 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -4435,6 +4435,27 @@ def test_dylink_global_var(self): int x = 123; ''', expected=['extern is 123.\n'], force_c=True) + @needs_dylink + def test_dylink_global_var_export(self): + self.do_run(r''' + #include + #include + #include + #include + + EMSCRIPTEN_KEEPALIVE int my_number = 123456; + + int main(void) { + void* js_address = EM_ASM_PTR({ + console.log("JS:_my_number:", _my_number, HEAP32[_my_number/4]); + return _my_number; + }); + printf("C: my_number: %ld %d\n", (long)&my_number, my_number); + assert(js_address == &my_number); + return 0; + } + ''', emcc_args=['-sMAIN_MODULE'], force_c=True) + @with_dylink_reversed def test_dylink_global_var_modded(self): self.dylink_test(main=r''' diff --git a/tools/emscripten.py b/tools/emscripten.py index f13391b5be020..216411ab93f8b 100644 --- a/tools/emscripten.py +++ b/tools/emscripten.py @@ -441,7 +441,9 @@ def emscript(in_wasm, out_wasm, outfile_js, js_syms, finalize=True, base_metadat if base_metadata: function_exports = base_metadata.function_exports - global_exports = base_metadata.global_exports + # We want the real values from the final metadata but we only want to + # include names from the base_metadata. See phase_link() in link.py. + global_exports = {k: v for k, v in metadata.global_exports.items() if k in base_metadata.global_exports} else: function_exports = metadata.function_exports global_exports = metadata.global_exports