Skip to content

Exported int sometimes corrupted with -sMAIN_MODULE #22980

Closed
@hoodmane

Description

@hoodmane

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

  1. Drop -sMAIN_MODULE or -sMAIN_MODULE=2.
  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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions