During my experiments with Embedded Swift and WASM, I wrote U16String
(a UTF-16 String implementation) and adapted the JavaScriptKit
library to compile and work in Embedded mode.
I'm using swift-for-wasm-examples as a foundation.
While working within one project with multiple targets, it compiles fine. However, when I try to move U16String
and/or JavaScriptKit
into a separate package, it fails. In my case, JavaScriptKit
also depends on U16String
.
I prepared the example project DuplicatesDemo_EmbeddedSwiftWASM.zip that reproduces the issue.
I'm using swift-wasm-DEVELOPMENT-SNAPSHOT-2024-05-25-a.
Building it with swift build -c release --triple wasm32-unknown-none-wasm
command.
Getting the following errors:
wasm-ld: error: duplicate symbol: $s4Lib1AACyAB4Lib2ACVcfC
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: $s4Lib1AACN
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_allocObject
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: $s4Lib1AACfD
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_deallocClassInstance
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_initStackObject
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_initStaticObject
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_deallocObject
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_deallocPartialClassInstance
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_slowAlloc
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_slowDealloc
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_willThrow
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_errorInMain
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_unexpectedError
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_release
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: $ss13swift_release6objectyBp_tF
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_retain
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_retain_n
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: swift_release_n
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
wasm-ld: error: duplicate symbol: $ss15swift_release_n6object1nyBp_s6UInt32VtF
>>> defined in .build/wasm32-unknown-none-wasm/release/App.build/App.swift.o
>>> defined in .build/wasm32-unknown-none-wasm/release/Lib1.build/Lib1.swift.o
Seems Swift compiles just fine while wasm-ld
confused with duplicate symbols.
Is it possible to fix this with some additional or different flags?
I can continue experimenting within one project, but I have prepared U16String
as a dedicated package and a PR into JavaScriptKit
because collaborating with other developers would be great.
cc: @rauhul @Max_Desiatov @kateinoigakukun @bnbarham @tkremenek