emscripten-core / emscripten-core/emscripten
[dynamic linking] Uncaught RuntimeError: memory access out of bounds
- Dominant language
- C++
- Stars
- 27.6k
- Forks
- 3.6k
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 105
Description
I use dynamic linking with pthreads. Sorry that my project is very large so that I can't get a tiny demo to reproduce this issue.
The error is as follwing.
```
Uncaught RuntimeError: memory access out of bounds
at std::__2::vector>::__destroy_vector::operator()[abi:v15007]() (0627d8b2:0x2cd72d)
at invoke_iii (cadbca22-8309-42b5-a7d5-676c369a2b40:66992:34)
at BRC::File::File(char const*, char const*, unsigned char*, long) (0627d8b2:0xf04613)
at invoke_iiiiii (cadbca22-8309-42b5-a7d5-676c369a2b40:67080:34)
at BRC::FileUtil::readFile(char const*) (0627d8b2:0xf042cb)
....
```
I tried my best to find out some information that might help. The wat content of the same function for W/O dynamic linking of ` BRC::File::File(char const*, char const*, unsigned char*, long) (0627d8b2:0xf04613)` are followings:
```
// Without dynamic linking (works normal)
(func $BRC::File::File(char const*, char const*, unsigned char*, long) (;155805;) (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32) (param $var4 i32) (result i32)
(local $var5 i32)
global.get $GOT.data.internal.__THREW__
local.set $var5
local.get $var0
local.get $var2
call $std::__2::basic_string, std::__2::allocator>::basic_string[abi:v15007](char const*)
local.set $var2
local.get $var5
i32.const 0
i32.store
i32.const 61 ==========> here the func index is a const
local.get $var2
i32.const 12
i32.add
local.get $var1
call $invoke_iii
drop
local.get $var5
i32.load
local.set $var0
local.get $var5
i32.const 0
i32.store
block $label0
local.get $var0
i32.const 1
i32.eq
br_if $label0
local.get $var2
local.get $var4
i32.store offset=28
local.get $var2
local.get $var3
i32.store offset=24
local.get $var2
return
end $label0
call $__cxa_find_matching_catch_2
local.set $var5
call $getTempRet0
drop
local.get $var2
call $std::__2::basic_string, std::__2::allocator>::~basic_string()
drop
local.get $var5
call $__resumeException
unreachable
)
```
```
// Side module (crash)
(func $BRC::File::File(char const*, char const*, unsigned char*, long) (;49916;) (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32) (param $var4 i32) (result i32)
(local $var5 i32)
global.get $__THREW__
local.set $var5
local.get $var0
local.get $var2
call $std::__2::basic_string, std::__2::allocator>::basic_string[abi:v15007](char const*)
local.set $var0
local.get $var5
i32.const 0
i32.store
global.get $__table_base ===========> here the func index is __table_base (but why it didn't add an offset )
local.get $var0
i32.const 12
i32.add
local.get $var1
**call $invoke_iii** (Crashed)
drop
local.get $var5
i32.load
local.set $var1
local.get $var5
i32.const 0
i32.store
local.get $var1
i32.const 1
i32.ne
if
local.get $var0
local.get $var4
i32.store offset=28
local.get $var0
local.get $var3
i32.store offset=24
local.get $var0
return
end
call $__cxa_find_matching_catch_2
local.set $var1
call $getTempRet0
drop
local.get $var0
call $std::__2::basic_string, std::__2::allocator>::~basic_string()
drop
local.get $var1
call $__resumeException
unreachable
)
```
The strange thing is that the table base is used directly without adding an offset. I checked some other usage of __table_base, most of them are like
```
global.get $__table_base
i32.const 5678
i32.add
```
Contributor guide
Assessment
This issue has not been assessed yet.