Closed
Description
Sometimes references a C variable via HEAP32[_variable/4]
doesn't work.
a.c
const int my_number = 123456;
b.c
extern const int my_number;
#include "stdio.h"
int main(void) {
printf("my_number: %d\n", my_number);
}
pre.js
Module.preRun = () => {
console.log("HEAP32[_my_number/4]:", HEAP32[_my_number/4]);
}
Compile, link, execute
emcc -fPIC -c a.c
emcc -fPIC -c b.c
LDFLAGS="\
-sEXPORTED_FUNCTIONS=_main,_my_number \
-sMAIN_MODULE=1 \
--pre-js=pre.js \
"
emcc $LDFLAGS b.o a.o
node a.out.js
Edit: To reproduce, b.o
comes before a.o
.
Output
I got:
HEAP32[_my_number/4]: 1701209717
my_number: 123456
It should print:
HEAP32[_my_number/4]: 123456
my_number: 123456
Changes that fix it
- Drop
-sMAIN_MODULE
or-sMAIN_MODULE=2
. - Swap the order of the object files a.o and b.o so that the link command is
emcc $LDFLAGS a.o b.o
If I drop the const
in a.c
, then it seems to return the same wrong number independent of the link order.
Version of emscripten/emsdk
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.72-git (65f3d78fed2d1786afe278ec20bbe13425d8a51c)
clang version 20.0.0git (https:/github.com/llvm/llvm-project 50866e84d1da8462aeb96607bf6d9e5bbd5869c5)
Target: wasm32-unknown-emscripten
Thread model: posix
and
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.68 (ceee49d2ecdab36a3feb85a684f8e5a453dde910)
clang version 20.0.0git (https:/github.com/llvm/llvm-project 5cc64bf60bc04b9315de3c679eb753de4d554a8a)
Target: wasm32-unknown-emscripten
Thread model: posix
Metadata
Metadata
Assignees
Labels
No labels