wasm-ld: error: ....... not a relocatable wasm file

171 views
Skip to first unread message

Fernando Bitti Loureiro

unread,
Jun 7, 2020, 9:34:40 AM6/7/20
to emscripten-discuss
Hi, everyone, 

First of all, congratulations on the amazing job of developing a tool like Emscripten.
In order to learn wasm in practice, I've started to compile other people's libraries and, when I find any roadblock, google my way around it.

I'm asking for your help because in this case, I don't know what else to do.

This is the project: https://github.com/OpenGene/repaq.
The moment I face an issue is when I ask Emscripten to generate the JS code to let me run the WASM code. 

These are the steps I followed.
1. First of all, I checked I could compile the repository using C++, by running make. And it worked.

2. Then I run:
# emmake make repaq CXX=emcc CXXFLAGS="-s USE_ZLIB=1 -s RELOCATABLE=1 -s USE_PTHREADS=0 $CXXFLAGS"
Emscripten also works and, despite some warnings, I get a valid repaq.wasm file.

3. I rename repaq.wasm to repaq.o for the next step.
# mv repaq.wasm repaq.o

4. Now I run:
# emcc -v repaq.o -o repaq.js -s USE_ZLIB=1 -s RELOCATABLE=1 -s USE_PTHREADS=0 -s EXTRA_EXPORTED_RUNTIME_METHODS="['callMain']"  -Wl,--relocatable
and it fails with: 
wasm-ld: error: repaq.o: not a relocatable wasm file

The files were clearly generated with "-s RELOCATABLE=1" and I don't find documentation on what else to do about it.
Any ideas?

Thank you for your kind attention,

Fernando

These are the versions of the tools I'm using: 
# emcc --version
emcc (Emscripten gcc/clang-like replacement) 1.39.17 (e4271595539cf1ca81128280cdc72f7245e700a0)

# emcc -Wl,--version
LLD 11.0.0 (/b/s/w/ir/cache/git/chromium.googlesource.com-external-github.com-llvm-llvm--project cc2349e3cf0e1f492433941b359a03fc3f746410)

Note: I already tried combining lots of options, as well as removing "-lpthreads" from the make file, but I always get stuck here.
If I use "-s USE_PTHREADS=1" I get a different type of error, related to atomics.
However as the original project still compiles in C++ and works even without "-lpthreads", I preferred to test it this way in order to simplify.


Thomas Lively

unread,
Jun 7, 2020, 2:10:44 PM6/7/20
to emscripte...@googlegroups.com
Hi Fernando,

There seems to be an unfortunate name clash here between the "-s RELOCATABLE=1" option and the concept of a relocatable object. The description of the "-s RELOCATABLE=1" option from settings.js is:

// If set to 1, we emit relocatable code from the LLVM backend; both
// globals and function pointers are all offset (by gb and fp, respectively)
// Automatically set for SIDE_MODULE or MAIN_MODULE.

This is somewhat confusing because it says "relocatable code," but then talks about making the code position independent, which is a different meaning of relocatable. My guess is that this Emscripten option predates real WebAssembly object files. Anyway, the point is that this option does not make Emscripten emit a real object file, so it is not surprising that wasm-ld doesn't know what to do with it. You can make Emscripten produce an object file using "-c", just like gcc or clang.

Thomas

--
You received this message because you are subscribed to the Google Groups "emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to emscripten-disc...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/emscripten-discuss/c8f14aed-8071-4f3f-9e9a-0d82f332d7cao%40googlegroups.com.

Fernando Bitti Loureiro

unread,
Jun 7, 2020, 4:29:14 PM6/7/20
to emscripten-discuss
Hi Thomas,

With the info you provided I played around and managed to generate a .js file that runs just like the CLI, except I cannot access content from the local file system (which I understand is normal to WASM).
I will continue to test on a browser.

As for now though, let me just say thanks for helping me remove the roadblock.

Cheers,

Fernando


On Sunday, 7 June 2020 20:10:44 UTC+2, Thomas Lively wrote:
Hi Fernando,

There seems to be an unfortunate name clash here between the "-s RELOCATABLE=1" option and the concept of a relocatable object. The description of the "-s RELOCATABLE=1" option from settings.js is:

// If set to 1, we emit relocatable code from the LLVM backend; both
// globals and function pointers are all offset (by gb and fp, respectively)
// Automatically set for SIDE_MODULE or MAIN_MODULE.

This is somewhat confusing because it says "relocatable code," but then talks about making the code position independent, which is a different meaning of relocatable. My guess is that this Emscripten option predates real WebAssembly object files. Anyway, the point is that this option does not make Emscripten emit a real object file, so it is not surprising that wasm-ld doesn't know what to do with it. You can make Emscripten produce an object file using "-c", just like gcc or clang.

Thomas
To unsubscribe from this group and stop receiving emails from it, send an email to emscripten-discuss+unsub...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages