-sJS_MATH duplicate symbols against libc
Closed this issue · 4 comments
Running with -sJS_MATH is giving trouble:
wasm-ld: error: duplicate symbol: acos
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(acos.o)
wasm-ld: error: duplicate symbol: acosf
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(acosf.o)
wasm-ld: error: duplicate symbol: asin
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(asin.o)
wasm-ld: error: duplicate symbol: asinf
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(asinf.o)
wasm-ld: error: duplicate symbol: atan
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(atan.o)
wasm-ld: error: duplicate symbol: atan2
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(atan2.o)
wasm-ld: error: duplicate symbol: atan2f
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(atan2f.o)
wasm-ld: error: duplicate symbol: atanf
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(atanf.o)
wasm-ld: error: duplicate symbol: cos
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(cos.o)
wasm-ld: error: duplicate symbol: cosf
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(cosf.o)
wasm-ld: error: duplicate symbol: exp
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(exp.o)
wasm-ld: error: duplicate symbol: expf
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(expf.o)
wasm-ld: error: duplicate symbol: log
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(log.o)
wasm-ld: error: duplicate symbol: logf
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(logf.o)
wasm-ld: error: duplicate symbol: pow
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(pow.o)
wasm-ld: error: duplicate symbol: powf
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(powf.o)
wasm-ld: error: duplicate symbol: round
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(round.o)
wasm-ld: error: duplicate symbol: roundf
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(roundf.o)
wasm-ld: error: duplicate symbol: sin
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(sin.o)
wasm-ld: error: duplicate symbol: sinf
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libjsmath.a(jsmath.o)
>>> defined in C:\emsdk\emscripten\main\cache\sysroot\lib\wasm32-emscripten\pic\libc.a(sinf.o)
This will only happen (I believe) if you you are using -Wl,-whole-archive, since otherwise the second definition will be ignored.
It can also happen with -sMAIN_MODULE=1 which uses -Wl,-whole-archive under the hood. But not with -sMAIN_MODULE=2 which does not (and is recommended).
Can you confirm this?
You are probably right. I'm running the whole suite. #25163
Maybe there's a good way to detect the current incompatibility, and skip the combination gracefully?
Its not just JS_MATH.. any time we have libraries function that are designed to override other system library functions this currently breaking with -sMAIN_MODULE=1.
I've tried to fix a few of these cases, but just skipping might be best here. We could even simply declare that JS_MATH is not compatible with -sMAIN_MODULE=1 (especially since MAIN_MODULE=1 is very much not recommended since it produces obscenely large output.. I doubt it has any production users TBH).
In cases where we do want to fix these things the normal method is to make the optional definition (the one that comes second, in this case the libc one, into a weak symbol so that linker doesn't complain and just picks the first one).
We could even simply declare that JS_MATH is not compatible with
-sMAIN_MODULE=1
That is fine I think.
Analyzed the failing tests, they are all either MAIN_MODULE, SIDE_MODULE or LINKABLE.