emscripten-core / emscripten-core/emscripten
Emscripten calls null GOT entry when side module loaded with `allowUndefined: true`
- Dominant language
- C++
- Stars
- 27.6k
- Forks
- 3.6k
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 105
Description
The following code example looks up `GOT.__cxa_throw` which is `0` and then calls it which throws `TypeError: getWasmTableEntry(...) is not a function`. Calling `reportUndefinedSymbols` or removing `allowUndefined: true` resolves the crash.
### module.cpp
```cpp
#include
extern "C"
int cpp_func() {
try {
throw std::runtime_error(""); // crashes trying to throw this
} catch (const std::exception &e) {
return 0;
}
return 1;
}
```
### main.c
```C
#include
#include "stdio.h"
#include "emscripten.h"
typedef int (*InitFunc)(void);
int main(void) {
EM_ASM({
loadDynamicLibrary("module.so", { allowUndefined: true });
});
void* handle = dlopen("module.so", RTLD_NOW);
printf("handle: %p\n", handle);
if (!handle) {
return 1;
}
InitFunc init_func = (InitFunc)dlsym(handle, "cpp_func");
printf("init_func: %p\n", init_func);
if (!init_func) {
return 1;
}
int res = init_func(); // Crashes in init_func
printf("res: %d\n", res);
return 0;
}
```
### build.sh
```sh
em++ -c module.cpp -fPIC -fexceptions -g2 -O2
em++ module.o -o module.so \
-sWASM_BIGINT -sSIDE_MODULE=1 -fexceptions -g2 -O2
emcc -c main.c -fPIC -fexceptions -g2 -O2
emcc main.o -o main.js \
-sWASM_BIGINT -sMAIN_MODULE=1 -fexceptions -g2 -O2
```
Then run with `node main.js`.
**Version of emscripten/emsdk:**
Checked on 3.1.52, 3.1.58 and tip of tree:
```
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.62-git (0a0fa668c63cdaf14cfccb2ce62bc5afa46b4170)
clang version 19.0.0git (https:/github.com/llvm/llvm-project 0e62d5cf55479981da5e05e406bbca4afb3cdc4f)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /home/rchatham/Documents/programming/emsdk/upstream/bin
Build config: +assertions
```
Contributor guide
Assessment
This issue has not been assessed yet.